Parece que no puedo entender por qué esto no funciona.
Porque main
devuelve una promesa; todas las async
funciones lo hacen.
En el nivel superior, debes:
Utilice una async
función de nivel superior que nunca rechace (a menos que desee errores de "rechazo no controlado"), o
Usar then
y 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 await
en un módulo.
# 1 - async
Funció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 catch
función (en lugar de try
/ catch
sintaxis):
(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 - then
ycatch
main()
.then(text => {
console.log(text);
})
.catch(err => {
// Deal with the fact the chain failed
});
Se catch
llamará al controlador si se producen errores en la cadena o en su then
controlador. (Asegúrese de que su catch
controlador 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 then
devoluciones de llamada no arroje ningún error, no hay nada registrado para manejarlos.
# 3 de nivel superior await
en un módulo
No se puede usar await
en 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 async
contenedor 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á await
cumpliendo; cuando await
se evalúa un módulo que utiliza el nivel superior , básicamente devuelve una promesa al cargador de módulos (como lo hace una async
función), que espera hasta que se cumpla esa promesa antes de evaluar los cuerpos de los módulos que dependen de él.
await
no es más que azúcar para lathen
sintaxis de promesa .