Non riesco a avvolgere la testa perché non funziona.
Perché main
restituisce una promessa; tutte le async
funzioni lo fanno.
Al livello superiore, è necessario:
Utilizzare una async
funzione di livello superiore che non rifiuta mai (a meno che non si desideri errori di "rifiuto non gestito"), oppure
Utilizzare then
e catch
, o
(Prossimamente!) Usa il livello superioreawait
, una proposta che ha raggiunto la fase 3 nel processo che consente l'uso di livello superiore await
in un modulo.
# 1 - async
Funzione di livello superiore che non rifiuta mai
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Notare il catch
; si deve gestire i rifiuti promessa / eccezioni asincrone, dal momento che nulla sta andando; non hai un chiamante a cui trasferirli. Se preferisci, puoi farlo sul risultato di chiamarlo tramite la catch
funzione (piuttosto che try
/ catch
sintassi):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... che è un po 'più conciso (mi piace per questo motivo).
O, ovviamente, non gestire gli errori e consentire solo l'errore "rifiuto non gestito".
# 2 - then
ecatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Il catch
gestore verrà chiamato se si verificano errori nella catena o nel then
gestore. (Assicurati che il catch
gestore non generi errori, poiché non è stato registrato nulla per gestirli.)
O entrambi gli argomenti per then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Si noti di nuovo che stiamo registrando un gestore di rifiuto. Ma in questo modulo, assicurati che nessuno dei tuoi then
callback non generi errori, non è registrato nulla per gestirli.
# 3 di primo livello await
in un modulo
Non è possibile utilizzare await
al livello superiore di uno script non modulo, ma la proposta di livello superioreawait
( Fase 3 ) consente di utilizzarlo al livello superiore di un modulo. È simile all'utilizzo di un async
wrapper di funzioni di livello superiore (n. 1 sopra) in quanto non si desidera rifiutare il codice di livello superiore (generare un errore) poiché ciò comporterà un errore di rifiuto non gestito. Quindi, a meno che tu non voglia avere quel rifiuto non gestito quando le cose vanno male, come con il n. 1, vorresti racchiudere il tuo codice in un gestore di errori:
// 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
}
Nota che se lo fai, qualsiasi modulo importato dal tuo modulo attenderà fino a quando la promessa che stai await
risolvendo; quando await
viene valutato un modulo che utilizza il livello superiore , sostanzialmente restituisce una promessa al caricatore del modulo (come fa una async
funzione), che attende fino a quando tale promessa non viene risolta prima di valutare i corpi di tutti i moduli che dipendono da esso.
await
non è altro che zucchero per lathen
sintassi promettente .