En el siguiente código.
const p = Promise.reject();; setTimeout(() => { p.catch(() => console.log("Error caught")); }, 0); Esperaba que se imprimiera el Error caught , pero cuando lo ejecuto en Node v16.15.1, se bloquea con el error UnhandledPromiseRejection .
node:internal/process/promises:279 triggerUncaughtException(err, true /* fromPromise */); ^ [UnhandledPromiseRejection: This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason "undefined".] { code: 'ERR_UNHANDLED_REJECTION' }El error no se detecta.
Luego probé en Chrome 102.0.5005.63 pero obtuve el Error caught impreso como se esperaba.
Ahora estoy muy confundido acerca de este comportamiento.
Debe haber al menos un controlador de rechazo adjunto a una Promesa en el momento en que la Promesa rechaza para evitar rechazos no controlados. La promesa se habrá rechazado (y se habrá generado el error) en el momento en que se ejecute la devolución de llamada de tiempo de espera.
Su código también produce un rechazo no controlado en Chrome, como se esperaba: agregue un oyente de rechazo no unhandledrejection para ver (aunque, por supuesto, a diferencia de Node, esto no bloquea la página)
window.addEventListener('unhandledrejection', () => { console.log('Unhandled rejection detected'); }); const p = Promise.reject();; setTimeout(() => { p.catch(() => console.log("Error caught")); }, 0); Agregar un .catch después de que se haya rechazado la Promesa dará como resultado que se ejecute el controlador .catch , pero el motor ya habrá visto que en el momento en que se rechazó la Promesa, el rechazo no se manejó.
El mejor enfoque para este tipo de cosas: agregue un controlador .catch de forma síncrona cuando se crea la Promesa, no después de cualquier posible acción asíncrona, de lo contrario, la Promesa podría rechazarse antes de que se adjunte el controlador.