Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

344
Vistas
JS PUEDE (comportarse de manera diferente en diferentes tiempos de ejecución) no captar la promesa rechazada en setTimeout

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.

about 4 years ago · Santiago Gelvez
1 Respuestas
Responde la pregunta

0

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.

about 4 years ago · Santiago Gelvez Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda