Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

343
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!