
使用Bluebird Promises 進行非同步異常處理
考慮以下場景:您需要在受控環境中處理異常而不導致應用程式崩潰。讓我們使用Bluebird Promise 來檢查這個具體範例:
1 2 3 4 5 6 7 8 9 | <code class = "javascript" > var Promise = require ( 'bluebird' );
function getPromise(){
return new Promise( function (done, reject){
setTimeout( function (){
throw new Error( "AJAJAJA" );
}, 500);
});
}</code>
|
登入後複製
當setTimeout 回呼中引發異常時,Node.js 事件循環會捕獲該異常並記錄到控制台,從而導致程式崩潰:
1 2 3 4 5 6 7 8 | $ node bluebird.js
c:\blp\rplus\bbcode\scratchboard\bluebird.js:6
throw new Error( "AJAJAJA" );
^
Error: AJAJAJA
at null._onTimeout (c:\blp\rplus\bbcode\scratchboard\bluebird.js:6:23)
at Timer.listOnTimeout [ as ontimeout] (timers.js:110:15)
|
登入後複製
Promise 但是可以捕捉從建構子回調中拋出的異常。要處理非同步回呼中引發的異常,您應該使用在錯誤時拒絕的 Promise 來包裝回調。
1 2 3 4 5 6 7 8 9 10 | <code class = "javascript" > function getPromise(){
return new Promise( function (done, reject){
setTimeout( function (){
done();
}, 500);
}).then( function () {
console.log( "hihihihi" );
throw new Error( "Oh no!" );
});
}</code>
|
登入後複製
在此修改後的範例中,異常由周圍的 Promise 鏈捕獲:
1 2 | $ node bluebird.js
Error [Error: Oh no!]
|
登入後複製
請記住,Promise 不會捕獲非同步回調中的異常。在這種情況下,請務必拒絕周圍的承諾,並在必要時使用 try-catch 區塊。這種方法可確保正常處理異常,而不會導致應用程式崩潰。
以上是如何使用 Bluebird Promise 處理非同步回呼中的異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!