2016-11-25 43 views
0

我正在創建一個返回承諾的資源加載函數。該函數的錯誤日誌:如何沉默諾言拒絕並停止履行鏈?

function load(url) { 
    return request(..) 
     .catch(function(error) { 
      log(error); 
      throw error; 
     }); 
} 

功能在各個連鎖店使用:

load(a).then(function(res1) { 
    load(b).then(function(res2) { 
     // res1 + res2 
    }); 
}); 

我希望能夠登錄資源異常並停止許諾鏈存在。如果我沉默它,鏈將導致then,如果我再次拋出,它將變成未處理的拒絕。 通過節點的process在全局範圍內捕獲這些文件不是一個選項,因爲平臺上的其他庫可能依賴於它。

可以拒絕被拒絕,並仍然阻止履行鏈繼續?

+0

添加一個最終的catch來阻止'未處理的拒絕' - 儘管如我所見,未處理的拒絕對代碼執行沒有影響,因爲這是異步中的異常無論如何你要「停止」的代碼鏈 - 是否有任何理由需要防止這種無關緊要的控制檯錯誤?編輯:剛剛意識到,這是一個nodejs問題 - 對不起 –

+0

unhandledRejection事件是有記錄錯誤,否則將被吞下;它並不是一個編程鉤子。你不必擔心取決於它的其他代碼,但你應該清理。該文檔說:「爲了解決這些故障,一個不可操作的.catch((=){})處理程序可能會附加到resource.loaded,這將阻止'unhandledRejection'事件被髮射。」_ – teppic

回答

0

標準ES6承諾只有三種結果:

  1. 解決
  2. 被拒絕的
  3. 未曾解決或拒絕。

一旦它被解析或被拒絕,就沒有ECMAScript標準方式告訴它不要調用它的任何處理程序。

有一些第三方承諾庫支持.abort()方法或.cancel()方法。例如,Bluebird 3.x有一個.cancel()方法,該方法將停止該鏈,並且不會爲該承諾調用任何一個.then()處理程序。

使用標準承諾處理此問題的常用方法是創建一個已知的已解決狀態或已拒絕的狀態,指示該鏈不應繼續,然後您必須讓處理程序可立即連接,以檢查該特定狀態。通過添加.cancel()方法並覆蓋.then().catch()可以在標準承諾中添加.cancel()功能,以在調用處理程序之前檢查取消狀態的承諾。