Wie kann ich async / await auf der obersten Ebene verwenden?

13

Ich habe Async durchlaufen / warten und nachdem ich mehrere Artikel durchgegangen bin, habe ich beschlossen, die Dinge selbst zu testen. Ich kann jedoch nicht sagen, warum das nicht funktioniert:

%Vor%

Die Konsole gibt Folgendes aus (Knoten v8.6.0):

  

& gt; draußen: [Objektversprechen]

     

& gt; drinnen: Hey da

Warum wird die Protokollnachricht innerhalb der Funktion anschließend ausgeführt? Ich dachte, der Grund dafür, dass async / await erstellt wurde, war die synchrone Ausführung mit asynchronen Tasks.

Gibt es eine Möglichkeit, den in der Funktion zurückgegebenen Wert zu verwenden, ohne .then() nach main() ?

zu verwenden     
Felipe 01.10.2017, 18:55
quelle

2 Antworten

20
  

Ich kann mir nicht vorstellen, warum das nicht funktioniert.

Weil main eine Verheißung zurückgibt; Alle async Funktionen tun.

Auf der obersten Ebene müssen Sie entweder:

  1. Verwenden Sie eine Funktion async auf oberster Ebene, die niemals ablehnt, oder

  2. Verwenden Sie then und catch

# 1 - Top-level async Funktion, die niemals ablehnt

%Vor%

Beachten Sie die catch ; Sie müssen Verweigerungsverweigerungen / asynchrone Ausnahmen behandeln, da nichts anderes geschieht; Sie haben keinen Anrufer, um sie weiterzugeben. Wenn Sie dies vorziehen, können Sie dies tun, indem Sie es über die Funktion catch aufrufen (und nicht try / catch ):

%Vor%

... was ein bisschen prägnanter ist (ich mag es aus diesem Grund).

# 2 - then und catch

%Vor%

... oder beide Argumente für then :

%Vor%

Beachten Sie erneut, dass wir einen Ablehnungshandler registrieren.

    
T.J. Crowder 01.10.2017, 18:58
quelle
0

Da main() asynchron abläuft, wird eine Zusage zurückgegeben. Sie müssen das Ergebnis in then() method erhalten. Und weil then() ebenfalls eine Versprechung zurückgibt, müssen Sie process.exit() aufrufen, um das Programm zu beenden.

%Vor%     
Peracek 19.03.2018 13:29
quelle