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.
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();