Nie potrafię zrozumieć, dlaczego to nie działa.
Ponieważ main
zwraca obietnicę; wszystkie async
funkcje robią.
Na najwyższym poziomie musisz:
Użyj funkcji najwyższego poziomu, async
która nigdy nie odrzuca (chyba że chcesz uzyskać błędy „nieobsługiwanego odrzucenia”) lub
Użyj then
i catch
, lub
(Wkrótce!) Użyj najwyższego poziomuawait
, propozycji, która osiągnęła etap 3 w procesie, który pozwala na użycie najwyższego poziomu await
w module.
# 1 - async
Funkcja najwyższego poziomu, która nigdy nie odrzuca
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Zwróć uwagę na catch
; Państwo musi obsługiwać odrzucenia obietnica / async wyjątki, gdyż nic innego nie będzie; nie masz rozmówcy, któremu mógłbyś je przekazać. Jeśli wolisz, możesz to zrobić na wyniku wywołania go za pomocą catch
funkcji (zamiast try
/ catch
syntax):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... który jest nieco bardziej zwięzły (podoba mi się z tego powodu).
Lub, oczywiście, nie obsługuj błędów i po prostu zezwalaj na błąd „nieobsługiwanego odrzucenia”.
# 2 - then
icatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Procedura catch
obsługi zostanie wywołana, jeśli wystąpią błędy w łańcuchu lub w twoim then
module obsługi. (Upewnij się, że catch
program obsługi nie zgłasza błędów, ponieważ nic nie zostało zarejestrowane do ich obsługi).
Lub oba argumenty za then
:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Ponownie zauważ, że rejestrujemy moduł obsługi odrzucania. Ale w tej formie upewnij się, że żaden z twoich plikówthen
wywołań zwrotnych nie generuje żadnych błędów, nic nie jest zarejestrowane, aby je obsłużyć.
# 3 najwyższy poziom await
w module
Nie można używać await
na najwyższym poziomie skryptu niebędącego modułem, ale propozycja najwyższego poziomuawait
( Etap 3 ) pozwala na użycie go na najwyższym poziomie modułu. Jest to podobne do używania async
opakowania funkcji najwyższego poziomu (# 1 powyżej), ponieważ nie chcesz, aby kod najwyższego poziomu odrzucał (zgłaszał błąd), ponieważ spowoduje to nieobsłużony błąd odrzucenia. Więc jeśli nie chcesz mieć tego nieobsługiwanego odrzucenia, gdy coś pójdzie nie tak, jak w przypadku # 1, chciałbyś opakować swój kod w moduł obsługi błędów:
// 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
}
Zwróć uwagę, że jeśli to zrobisz, każdy moduł, który zaimportuje z Twojego modułu, będzie czekał, aż obietnica, którą tworzysz, zostanie await
spełniona; kiedy moduł używający najwyższego poziomu await
jest oceniany, w zasadzie zwraca obietnicę do modułu ładującego (podobnie jak async
funkcja), który czeka, aż ta obietnica zostanie rozliczona, przed oceną treści wszelkich modułów, które od niej zależą.
await
to nic innego jak cukier dlathen
składni obietnicy .