No se puede lanzar el error desde una función ejecutora de promesa asincrónica

He intentado obtener una comprensión conceptual de por qué el siguiente código no capta el throw . Si elimina la palabra clave async del new Promise(async (resolve, ... part), entonces funciona bien, por lo que tiene que ver con el hecho de que el ejecutor Promise es una función asíncrona.

 (async function() { try { await fn(); } catch(e) { console.log("CAUGHT fn error -->",e) } })(); function fn() { return new Promise(async (resolve, reject) => { // ... throw new Error("<>"); // ... }); } 

Las respuestas aquí , aquí y aquí repiten que “si estás en cualquier otra callback asíncrona, debes usar reject “, pero por “asincrónico” no se están refiriendo a funciones async , así 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 async / await del Promise constructor Promise !

Nunca use una async function como una función ejecutor Promise (¡incluso cuando pueda hacer que funcione 1 ) !

[1: llamando a resolve y reject lugar de usar declaraciones de return y throw ]

por “asincrónico” no se están refiriendo a las funciones de async , por lo que no creo que sus explicaciones se apliquen aquí

Ellos también podrían. Un simple ejemplo 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 ahora está claro que el throw está dentro de una callback asincrónica.

El constructor de Promise solo puede capturar excepciones sincrónicas , y una async function nunca arroja – siempre devuelve una promesa (que puede ser rechazada). Y ese valor de retorno se ignora, ya que la promesa está esperando que se llame a la resolve .