javascript - No se puede lanzar el error desde una función ejecutora de promesa asíncrona
node.js promise (1)
He estado tratando de obtener una comprensión conceptual de por qué el siguiente código no atrae el
throw
.
Si elimina la palabra clave
async
de la
new Promise(async (resolve, ...
parte, entonces funciona bien, por lo que tiene que ver con el hecho de que el ejecutor de Promise es una función asincrónica).
(async function() {
try {
await fn();
} catch(e) {
console.log("CAUGHT fn error -->",e)
}
})();
function fn() {
return new Promise(async (resolve, reject) => {
// ...
throw new Error("<<fn error>>");
// ...
});
}
Las respuestas
here
,
here
y
here
repiten que "si está en cualquier otra devolución de llamada asincrónica, debe usar
reject
", pero por "asincrónica" no se refieren a funciones
async
, por lo que no creo que se apliquen sus explicaciones aquí (y si lo hacen, no entiendo cómo).
Si en lugar de
throw
usamos
reject
, el código anterior funciona bien.
Me gustaría entender,
fundamentalmente
, por qué
throw
no funciona aquí.
¡Gracias!
¡Esta es la versión asíncrona / en espera del
antipatrón del constructor
Promise
!
Never
use una
async function
como una función ejecutora de
Promise
(incluso cuando puede hacer que funcione
1
)
!
[1: llamando a
resolve
y
reject
lugar de usar declaraciones
return
y
throw
]
por "asíncrono" no se refieren a funciones
async
, así que no creo que sus explicaciones se apliquen aquí
Podrían también. Un ejemplo simple donde no puede funcionar es
new Promise(async function() {
await delay(…);
throw new Error(…);
})
que es equivalente a
new Promise(function() {
return delay(…).then(function() {
throw new Error(…);
});
})
donde está claro ahora que el
throw
está dentro de una devolución de llamada asincrónica.
El
constructor
Promise
solo puede detectar excepciones
síncronas
, y una
async function
nunca se activa
; siempre devuelve una promesa (aunque puede ser rechazada).
Y ese valor de retorno se ignora, ya que la promesa está esperando que se llame la
resolve
.