2017-07-12 4 views
2

Ich versuche, mich in NodeJS async/erwarten.Anforderung einer asynchronen Funktion in NodeJS

Ich habe eine Funktion in einer Datei wie folgt:

const getAccessToken = async() => { 
    return new Promise((resolve, reject) => { 

    const oauthOptions = { 
     method: 'POST', 
     url: oauthUrl, 
     headers: { 
     'Authorization': 'Basic ' + oauthToken 
     }, 
     form: { 
     grant_type: 'client_credentials' 
     } 
    }; 

    request(oauthOptions) 
     .then((err, httpResponse, body) => { 
     if (err) { 
      return reject('ERROR : ' + err); 
     } 
     return resolve(body.access_token); 
     }) 
     .catch((e) => { 
     reject('getAccessToken ERROR : ' + e); 
     }); 
    }); 
}; 

module.exports = getAccessToken; 

Diese Datei als twitter.js in einem lib Ordner

In meiner index.js Datei gespeichert habe ich folgendes:

const getAccessToken = require('./lib/twitter'); 

let accessToken; 

try { 
    accessToken = await getAccessToken(); 
} catch (e) { 
    return console.log(e); 
} 

console.log(accessToken); 

Ich erhalte eine Fehlermeldung, wenn ich versuche, den folgenden Code auszuführen:

> accessKey = await getAccessToken(); 
>      ^^^^^^^^^^^^^^ 
> 
> SyntaxError: Unexpected identifier 
>  at createScript (vm.js:74:10) 
>  at Object.runInThisContext (vm.js:116:10) 
>  at Module._compile (module.js:533:28) 
>  at Object.Module._extensions..js (module.js:580:10) 
>  at Module.load (module.js:503:32) 
>  at tryModuleLoad (module.js:466:12) 
>  at Function.Module._load (module.js:458:3) 
>  at Function.Module.runMain (module.js:605:10) 
>  at startup (bootstrap_node.js:158:16) 
>  at bootstrap_node.js:575:3 

Kann ich nicht await die erforderliche Funktion, wie es markiert ist async?

+1

Welche Version von NodeJs? –

+1

8.1.4 (unter Ubuntu) –

+3

die Funktion 'getAccessToken = async() =>' sollte nicht async sein, und der Code 'accessKey = wartet auf getAccessToken();' sollte innerhalb einer asynchronen Funktion sein –

Antwort

5

Ihr Code ist bereits korrekt. ohne etwas zu ändern in twitter.js haben Sie zwei Möglichkeiten, es zu benutzen:

  1. Funktionen markiert mit async immer Versprechungen zurück. Daher können Sie einfach tun:

    const getAccessToken = require('./lib/twitter'); 
    
    getAccessToken().then(accessToken => { 
        console.log(accessToken); 
    }) 
    
  2. Alle Funktionen, die Versprechen zurückkehren kann awaited auf, aber Sie können nicht außerhalb eines async markierten Funktionen erwarten verwenden. So können Sie auch tun:

    const getAccessToken = require('./lib/twitter'); 
    
    (async function() { 
        var accessToken = await getAccessToken(); 
        console.log(accessToken); 
    })(); 
    

Die Asynchron/warten Keywords ändert sich nicht, wie async Funktionen verhalten. Sie immer noch kann nicht auf asynchrone Funktionen synchron warten, können Sie das nur innerhalb einer asynchronen Funktion tun. Async/erwarten ist nur eine Syntax Zucker neben Versprechungen.

+0

Großartig danke @slebetman, das erklärt es wirklich gut –

4

Sie sind auf dem richtigen Weg, aber await kann nur innerhalb eine asynchrone Funktion verwendet werden. Sie haben also Ihre Struktur rückwärts und können leicht durch Ändern einiger Dinge gelöst werden. Ich schlage jedoch vor, dass Sie Ihren Code übersehen und strukturelle Änderungen vornehmen. Aber hier ist eine funktionierende Version des Codes:

const getAccessToken =() => { 
    return new Promise((resolve, reject) => { 

    const oauthOptions = { 
     method: 'POST', 
     url: oauthUrl, 
     headers: { 
     'Authorization': 'Basic ' + oauthToken 
     }, 
     form: { 
     grant_type: 'client_credentials' 
     } 
    }; 

    request(oauthOptions) 
     .then((err, httpResponse, body) => { 
     if (err) { 
      return reject('ERROR : ' + err); 
     } 
     return resolve(body.access_token); 
     }) 
     .catch((e) => { 
     reject('getAccessToken ERROR : ' + e); 
     }); 
    }); 
}; 

module.exports = getAccessToken; 

Und dann:

const getAccessToken = require('./lib/twitter'); 

(async function() { 
    try { 
    let accessToken = await getAccessToken(); 
    console.log(accessToken); 
    } catch (e) { 
    return console.log(e); 
    } 
})() 

Dies ist eine einfache Lösung, um Ihren Code zu veranschaulichen, dass Sie es nach hinten haben, und einige strukturelle Veränderungen sind in Ordnung.

+1

Keine Notwendigkeit, ein Versprechen hier zu verwenden. Das 'async' Schlüsselwort ist ein Versprechensgenerator. – slebetman

+1

Danke @Svenskunkanka, das hat funktioniert.Ich schätze Ihre Hilfe –

Verwandte Themen