Parece que no puedo entender por qué esto no funciona.
Porque maindevuelve una promesa; todas las asyncfunciones lo hacen.
En el nivel superior, debes:
Utilice una asyncfunción de nivel superior que nunca rechace (a menos que desee errores de "rechazo no controlado"), o
Usar theny catch, o
(¡Próximamente!) Utilice el nivel superiorawait , una propuesta que ha alcanzado la Etapa 3 en el proceso que permite el uso de nivel superior awaiten un módulo.
# 1 - asyncFunción de nivel superior que nunca rechaza
(async () => {
try {
var text = await main();
console.log(text);
} catch (e) {
// Deal with the fact the chain failed
}
})();
Note el catch; debe manejar los rechazos de promesa / excepciones asíncronas, ya que nada más lo hará ; no tienes quien llama para pasarlos. Si lo prefiere, puede hacerlo con el resultado de llamarlo a través de la catchfunción (en lugar de try/ catchsintaxis):
(async () => {
var text = await main();
console.log(text);
})().catch(e => {
// Deal with the fact the chain failed
});
... que es un poco más conciso (por eso me gusta).
O, por supuesto, no maneje los errores y solo permita el error de "rechazo no controlado".
# 2 - thenycatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Se catchllamará al controlador si se producen errores en la cadena o en su thencontrolador. (Asegúrese de que su catchcontrolador no arroje errores, ya que no hay nada registrado para manejarlos).
O ambos argumentos para then:
main().then(
text => {
console.log(text);
},
err => {
// Deal with the fact the chain failed
}
);
Nuevamente, observe que estamos registrando un controlador de rechazo. Pero de esta forma, asegúrese de que ninguna de sus thendevoluciones de llamada no arroje ningún error, no hay nada registrado para manejarlos.
# 3 de nivel superior awaiten un módulo
No se puede usar awaiten el nivel superior de un script que no sea de módulo, pero la propuesta de nivel superiorawait ( Etapa 3 ) le permite usarlo en el nivel superior de un módulo. Es similar al uso de un asynccontenedor de funciones de nivel superior (# 1 arriba) en que no desea que su código de nivel superior rechace (arroje un error) porque eso dará como resultado un error de rechazo no controlado. Entonces, a menos que desee tener ese rechazo no controlado cuando las cosas salen mal, como con el n. ° 1, querrá incluir su código en un controlador de errores:
// 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
}
Tenga en cuenta que si hace esto, cualquier módulo que importe desde su módulo esperará hasta que se cumpla la promesa que está awaitcumpliendo; cuando awaitse evalúa un módulo que utiliza el nivel superior , básicamente devuelve una promesa al cargador de módulos (como lo hace una asyncfunción), que espera hasta que se cumpla esa promesa antes de evaluar los cuerpos de los módulos que dependen de él.
awaitno es más que azúcar para lathensintaxis de promesa .