Não consigo entender por que isso não funciona.
Porque mainretorna uma promessa; todas as asyncfunções fazem.
No nível superior, você deve:
Use uma asyncfunção de nível superior que nunca rejeite (a menos que você queira erros de "rejeição sem tratamento") ou
Use thene catch, ou
(Em breve!) Use nível superiorawait , uma proposta que atingiu o Estágio 3 no processo que permite o uso de nível superior awaitem um módulo.
# 1 - asyncFunção de nível superior que nunca rejeita
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Observe o catch; você deve lidar com exceções de rejeição de promessa / assíncrono, pois nada mais será necessário; você não tem quem ligar para eles. Se preferir, você pode fazer isso com o resultado da chamada através da catchfunção (em vez de try/ catchsintaxe):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... que é um pouco mais conciso (eu gosto por esse motivo).
Ou, é claro, não lide com erros e permita apenas o erro "rejeição sem tratamento".
# 2 - thenecatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
O catchmanipulador será chamado se ocorrerem erros na cadeia ou no seu thenmanipulador. (Certifique-se de que seu catchmanipulador não gere erros, pois nada está registrado para lidar com eles.)
Ou ambos os argumentos para then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Mais uma vez, observe que estamos registrando um manipulador de rejeição. Mas, neste formulário, verifique se nenhum dos seus thenretornos de chamada não gera erros, nada é registrado para lidar com eles.
Nível 3 awaitem um módulo
Você não pode usar awaitno nível superior de um script que não seja do módulo, mas a proposta de nível superiorawait ( Estágio 3 ) permite usá-lo no nível superior de um módulo. É semelhante ao uso de um asyncwrapper de função de nível superior (nº 1 acima), pois você não deseja que seu código de nível superior rejeite (gere um erro) porque isso resultará em um erro de rejeição sem tratamento. Portanto, a menos que você queira ter essa rejeição sem tratamento quando as coisas derem errado, como no número 1, convém agrupar seu código em um manipulador de erros:
// 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
}
Observe que, se você fizer isso, qualquer módulo que importe do seu módulo aguardará até que a promessa que você está fazendo seja awaitestabelecida; quando um módulo usando o nível superior awaité avaliado, basicamente retorna uma promessa ao carregador de módulos (como faz uma asyncfunção), que espera até que a promessa seja estabelecida antes de avaliar os corpos de qualquer módulo que dependa dele.
awaitnão é nada além de açúcar para athensintaxe da promessa .