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

139
Views
Llamar a .finally en una promesa que se trata/captura manejada en otro lugar provoca UnhandledPromiseRejection en nodejs

Recientemente encontré un comportamiento extraño con nodejs. Lo explicaré con el siguiente ejemplo:

digamos que tenemos dos funciones, foo y bar , foo crea una promesa, llama a .finally() y la devuelve. bar por otro lado, envuelve la promesa con un try/catch.

 const foo = () => {
 const promise = new Promise((resolve, reject) => {
 reject('my-error');
 });
 
 promise.finally(() => {
 console.log('at foo');
 });

 return promise;
}

const bar = async () => {
 try {
 const result = await foo();
 } catch (e) {
 console.log('at bar: ', e);
 }
}

bar();

la salida seria:

 at foo
at bar: my-error
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 "my-error".] {
 code: 'ERR_UNHANDLED_REJECTION'
}

A partir de la salida, podemos ver que el error es manejado por la función de bar , pero se lanza un error UnhandledPromiseRejection .

Sin embargo, si reemplazamos .finally() con .catch() no ocurrirá tal error.

 const foo = () => {
 const promise = new Promise((resolve, reject) => {
 reject('my-error');
 });

 promise.catch(() => {
 console.log('at foo');
 });

 return promise;
}

No estoy seguro de lo que está pasando aquí; Agradecería si alguien pudiera ayudarme a visualizar lo que está sucediendo.

almost 4 years ago · Santiago Trujillo
1 answers
Answer question

0

then , catch y finally cree nuevas promesas que se resuelvan según la promesa que usted llama y el resultado de la función de controlador que les pasa. (Si la resolución a es un poco desconocida, consulte la publicación de mi blog sobre terminología de promesa ).

Si desea utilizar finally la promesa creada en foo , devuelva la promesa resultante en lugar de usar catch de la siguiente manera

const foo = (props) => {
  return new Promise((resolve, reject) => {
    reject('my-error');
  }).finally(() => {
    console.log('at foo');
  });
}

const bar = async (e) => {
  try {
    await foo();
  } catch (error) {
    console.log('at bar: ', error);
  }
}

bar();

almost 4 years ago · Santiago Trujillo 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!