使用Bluebird Promises 進行非同步異常處理
考慮以下場景:您需要在受控環境中處理異常而不導致應用程式崩潰。讓我們使用Bluebird Promise 來檢查這個具體範例:
<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 事件循環會捕獲該異常並記錄到控制台,從而導致程式崩潰:
$ 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 來包裝回調。
<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 鏈捕獲:
$ node bluebird.js Error [Error: Oh no!]
請記住,Promise 不會捕獲非同步回調中的異常。在這種情況下,請務必拒絕周圍的承諾,並在必要時使用 try-catch 區塊。這種方法可確保正常處理異常,而不會導致應用程式崩潰。
以上是如何使用 Bluebird Promise 處理非同步回呼中的異常?的詳細內容。更多資訊請關注PHP中文網其他相關文章!