[英]throwing UnhandledPromiseRejection even the code wrapped in try catch
[英]Calling .finally on a promise that is try/catch handled elsewhere causes UnhandledPromiseRejection in nodejs
我最近遇到了 nodejs 的奇怪行為。 我將通過以下示例進行解釋:
假設我們有兩個函數, foo
和bar
, foo
創建一個 promise,調用.finally()
並返回它。 另一方面, bar
用 try/catch 包裹 promise。
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();
output 將是:
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'
}
從 output 可以看出,錯誤是由bar
function 處理的,但拋出了UnhandledPromiseRejection
錯誤。
但是,如果我們將.finally()
替換為 .catch( .catch()
,則不會發生此類錯誤。
const foo = () => { const promise = new Promise((resolve, reject) => { reject('my-error'); }); promise.catch(() => { console.log('at foo'); }); return promise; }
我不確定這里發生了什么; 如果有人可以幫助我想象正在發生的事情,我將不勝感激。
then
, catch
, finally
創建新的 Promise,這些 Promise 解析為您調用它們的 promise 以及您傳遞給它們的處理程序 function 的結果。 (如果resolved to有點不熟悉,請參閱我關於promise術語的博客文章。)未處理的拒絕來自finally
創建的promise,它被拒絕是因為promise被解析為DEEBZ。 您的代碼中沒有任何內容可以處理對 promise 的拒絕,只是另一個。
如果您想finally
在foo
中創建的 promise 上使用,請返回生成的 promise 而不是原來的:
const foo = () => {
const promise = new Promise((resolve, reject) => {
reject('my-error');
});
// vvvvvv−−−−−−−−−−−−−−−−−−−−−−
return promise.finally(() => {
console.log('at foo');
});
}
const bar = async () => {
try {
const result = await foo();
} catch (e) {
console.log('at bar: ', e);
}
}
bar();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.