首頁  >  文章  >  web前端  >  捕獲未處理的Promise錯誤

捕獲未處理的Promise錯誤

一个新手
一个新手原創
2017-10-13 09:21:232145瀏覽

透過監聽unhandledrejection事件,可以捕獲未處理的Promise錯誤。

為了保證可讀性,本文採用意譯而非直譯,並且對原始碼進行了大量修改。另外,本文版權歸原作者所有,翻譯僅用於學習。

使用Promise編寫非同步程式碼時,使用reject來處理錯誤。有時,開發者通常會忽略這一點,導致一些錯誤沒有被處理。例如:

function main() {
asyncFunc()
.then(···)
.then(() => console.log('Done!'));
}

#由於沒有使用catch方法捕獲錯誤,當asyncFunc()函數reject時,拋出的錯誤則沒有被處理。

這篇部落格將分別介紹在瀏覽器與Node.js中,如何捕捉那些未處理的Promise錯誤。

瀏覽器中未處理的Promise錯誤

有些瀏覽器(例如Chrome)能夠捕捉未處理的Promise錯誤。

unhandledrejection

監聽unhandledrejection事件,即可擷取到未處理的Promise錯誤:

window.addEventListener(
'unhandledrejection', event => ···);


這個事件是PromiseRejectionEvent實例,它有2個最重要的屬性:

  • promise: reject的Promise

  • #reason: Promise的reject值

#範例程式碼:

window.addEventListener('unhandledrejection', event =>
{
console.log(event.reason); // 打印"Hello, Fundebug!"
});
 
function foo()
{
Promise.reject('Hello, Fundebug!');
}
 
foo();


Fundebug的JavaScript錯誤監控插件監聽了unhandledrejection事件,因此可以自動捕獲未處理Promise錯誤。

rejectionhandled

當一個Promise錯誤最初未被處理,但是稍後又得到了處理,則會觸發rejectionhandled事件:

#
window.addEventListener(
'rejectionhandled', event => ···);

這個事件是PromiseRejectionEvent實例。

範例程式碼:

window.addEventListener('unhandledrejection', event =>
{
console.log(event.reason); // 打印"Hello, Fundebug!"
});
 
window.addEventListener('rejectionhandled', event =>
{
console.log('rejection handled'); // 1秒后打印"rejection handled"
});
 
 
function foo()
{
return Promise.reject('Hello, Fundebug!');
}
 
var r = foo();
 
setTimeout(() =>
{
r.catch(e =>{});
}, 1000);


Node.js中未處理的Promise錯誤

監聽unhandledRejection事件,即可擷取未處理的Promise錯誤:

#
process.on(
'unhandledRejection', (reason, promise) => ···);

#範例程式碼:

#
process.on('unhandledRejection', reason =>
{
console.log(reason); // 打印"Hello, Fundebug!"
});
 
function foo()
{
Promise.reject('Hello, Fundebug!');
}
 
foo();
########################################## ##

以上是捕獲未處理的Promise錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn