Ich kann mich nicht darum kümmern, warum das nicht funktioniert.
Weil main
ein Versprechen zurückkommt; Alle async
Funktionen funktionieren.
Auf der obersten Ebene müssen Sie entweder:
Verwenden Sie eine async
Funktion der obersten Ebene , die niemals ablehnt (es sei denn, Sie möchten "nicht behandelte Ablehnungsfehler") oder
Verwenden Sie then
und catch
, oder
(In Kürze verfügbar!) Verwenden Sie Top-Levelawait
, einen Vorschlag, der Stufe 3 des Prozesses erreicht hat und die Verwendung von Top-Level await
in einem Modul ermöglicht.
# 1 - Top-Level- async
Funktion, die niemals ablehnt
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Beachten Sie die catch
; Sie müssen mit Versprechungen / asynchronen Ausnahmen umgehen, da sonst nichts passiert. Sie haben keinen Anrufer, an den Sie sie weiterleiten können. Wenn Sie es vorziehen, können Sie dies anhand des Ergebnisses tun, indem Sie es über die catch
Funktion (anstelle von try
/ catch
syntax) aufrufen :
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... was etwas prägnanter ist (ich mag es aus diesem Grund).
Oder behandeln Sie natürlich keine Fehler und lassen Sie einfach den Fehler "Nicht behandelte Ablehnung" zu.
# 2 - then
undcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Der catch
Handler wird aufgerufen, wenn Fehler in der Kette oder in Ihrem then
Handler auftreten. (Stellen Sie sicher, dass Ihr catch
Handler keine Fehler auslöst, da nichts registriert ist, um diese zu behandeln.)
Oder beide Argumente an then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Beachten Sie erneut, dass wir einen Ablehnungshandler registrieren. Stellen Sie in dieser Form jedoch sicher, dass keiner Ihrer then
Rückrufe Fehler verursacht und nichts registriert ist, um diese zu behandeln.
# 3 Top-Level await
in einem Modul
Sie können await
ein Skript, das kein Modul ist, nicht auf der obersten Ebene verwenden. Mit dem await
Vorschlag auf oberster Ebene ( Stufe 3 ) können Sie es jedoch auf der obersten Ebene eines Moduls verwenden. Es ähnelt der Verwendung eines async
Funktions-Wrappers der obersten Ebene (Nr. 1 oben), da Sie nicht möchten, dass Ihr Code der obersten Ebene zurückgewiesen wird (einen Fehler auslöst), da dies zu einem nicht behandelten Ablehnungsfehler führt. Wenn Sie also nicht diese unbehandelte Ablehnung haben möchten, wenn etwas schief geht, wie bei Nummer 1, möchten Sie Ihren Code in einen Fehlerbehandler einschließen:
// In a module, once the top-level `await` proposal lands
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
Beachten Sie, dass in diesem Fall jedes Modul, das von Ihrem Modul importiert wird, wartet, bis das von Ihnen await
eingegangene Versprechen erfüllt ist. Wenn ein Modul mit Top-Level await
bewertet wird, gibt es im Grunde genommen ein Versprechen an den Modullader zurück (wie es eine async
Funktion tut), der wartet, bis dieses Versprechen erfüllt ist, bevor er die Körper aller Module bewertet, die davon abhängen.
await
ist nichts als Zucker für die Versprechenssyntaxthen
.