首頁 >web前端 >js教程 >Promise實現異步

Promise實現異步

php中世界最好的语言
php中世界最好的语言原創
2018-04-17 16:03:151542瀏覽

這次帶給大家Promise實現異步,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();

註: Node.js v6.6.0 預設會回報未處理的Promise錯誤,所以不去監聽unhandledrejection事件也沒問題。

# Fundebug的Node.js錯誤監控插件監聽了unhandledRejection事件,因此可以自動捕獲未處理Promise錯誤。

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦閱讀:



#

以上是Promise實現異步的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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