Nie potrafię zrozumieć, dlaczego to nie działa.
Ponieważ mainzwraca obietnicę; wszystkie asyncfunkcje robią.
Na najwyższym poziomie musisz:
Użyj funkcji najwyższego poziomu, asyncktóra nigdy nie odrzuca (chyba że chcesz uzyskać błędy „nieobsługiwanego odrzucenia”) lub
Użyj theni 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 awaitw module.
# 1 - asyncFunkcja 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ą catchfunkcji (zamiast try/ catchsyntax):
(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 - thenicatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Procedura catchobsługi zostanie wywołana, jeśli wystąpią błędy w łańcuchu lub w twoim thenmodule obsługi. (Upewnij się, że catchprogram 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 awaitw module
Nie można używać awaitna 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 asyncopakowania 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 awaitspełniona; kiedy moduł używający najwyższego poziomu awaitjest oceniany, w zasadzie zwraca obietnicę do modułu ładującego (podobnie jak asyncfunkcja), który czeka, aż ta obietnica zostanie rozliczona, przed oceną treści wszelkich modułów, które od niej zależą.
awaitto nic innego jak cukier dlathenskładni obietnicy .