javascript node.js promise async-await

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 .