Não consigo entender por que isso não funciona.
Porque main
retorna uma promessa; todas as async
funções fazem.
No nível superior, você deve:
Use uma async
função de nível superior que nunca rejeite (a menos que você queira erros de "rejeição sem tratamento") ou
Use then
e 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 await
em um módulo.
# 1 - async
Funçã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 catch
função (em vez de try
/ catch
sintaxe):
(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 - then
ecatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
O catch
manipulador será chamado se ocorrerem erros na cadeia ou no seu then
manipulador. (Certifique-se de que seu catch
manipulador 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 then
retornos de chamada não gera erros, nada é registrado para lidar com eles.
Nível 3 await
em um módulo
Você não pode usar await
no 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 async
wrapper 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 await
estabelecida; quando um módulo usando o nível superior await
é avaliado, basicamente retorna uma promessa ao carregador de módulos (como faz uma async
função), que espera até que a promessa seja estabelecida antes de avaliar os corpos de qualquer módulo que dependa dele.
await
não é nada além de açúcar para athen
sintaxe da promessa .