簡體   English   中英

在其他地方處理嘗試/捕獲的 promise 上調用.finally 會導致 nodejs 中的 UnhandledPromiseRejection

[英]Calling .finally on a promise that is try/catch handled elsewhere causes UnhandledPromiseRejection in nodejs

我最近遇到了 nodejs 的奇怪行為。 我將通過以下示例進行解釋:

假設我們有兩個函數, foobarfoo創建一個 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; }

我不確定這里發生了什么; 如果有人可以幫助我想象正在發生的事情,我將不勝感激。

thencatchfinally創建的 Promise,這些 Promise 解析為您調用它們的 promise 以及您傳遞給它們的處理程序 function 的結果。 (如果resolved to有點不熟悉,請參閱我關於promise術語的博客文章。)未處理的拒絕來自finally創建的promise,它被拒絕是因為promise被解析為DEEBZ。 您的代碼中沒有任何內容可以處理對 promise 的拒絕只是另一個。

如果您想finallyfoo中創建的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM