Ich kann mich nicht darum kümmern, warum das nicht funktioniert.
Weil mainein Versprechen zurückkommt; Alle asyncFunktionen funktionieren.
Auf der obersten Ebene müssen Sie entweder:
Verwenden Sie eine asyncFunktion der obersten Ebene , die niemals ablehnt (es sei denn, Sie möchten "nicht behandelte Ablehnungsfehler") oder
Verwenden Sie thenund 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 awaitin einem Modul ermöglicht.
# 1 - Top-Level- asyncFunktion, 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 catchFunktion (anstelle von try/ catchsyntax) 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 - thenundcatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Der catchHandler wird aufgerufen, wenn Fehler in der Kette oder in Ihrem thenHandler auftreten. (Stellen Sie sicher, dass Ihr catchHandler 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 thenRückrufe Fehler verursacht und nichts registriert ist, um diese zu behandeln.
# 3 Top-Level awaitin einem Modul
Sie können awaitein Skript, das kein Modul ist, nicht auf der obersten Ebene verwenden. Mit dem awaitVorschlag auf oberster Ebene ( Stufe 3 ) können Sie es jedoch auf der obersten Ebene eines Moduls verwenden. Es ähnelt der Verwendung eines asyncFunktions-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 awaiteingegangene Versprechen erfüllt ist. Wenn ein Modul mit Top-Level awaitbewertet wird, gibt es im Grunde genommen ein Versprechen an den Modullader zurück (wie es eine asyncFunktion tut), der wartet, bis dieses Versprechen erfüllt ist, bevor er die Körper aller Module bewertet, die davon abhängen.
awaitist nichts als Zucker für die Versprechenssyntaxthen.