2014-06-27 38 views
0

我有一個相當長的支票鏈Q,我會打斷它,當一個錯誤引起:Node.js的中止鏈Q中的不同點

我已經看了How to abort a failing Q promise in Node.JS和其他答案的SO,但對我來說似乎是不可能的,那不可能不存在其他任何東西。

例 `

Q().then(function(){ 
    return Q.ninvoke(myObject, 'save'); 
}).fail(functon(err){ // if error 
    res.status(400).send(err.message);// like duplicate key 
}).then(function(){ 
    add object another object to db referenced to myObject 
}).fail(functon(err){ // if error 
    res.status(400).send(err.message);// like connection error 
}).then(function(){ 
    do somethinng else 
}).done() 

`

顯然,如果不能保存的第一個對象,我也不會通過其他措施去,但我會退出,不扔的錯誤和阻塞執行服務器而不發送消息給客戶端。

我試過兩個函數添加到DONE(OK,拒絕),但只有OK()被調用。 我想避免如果可能分塊中的代碼3種不同的功能。

回答

0

據我所知,你不需要做任何特別棘手的事情,只要瞭解成功和失敗如何通過鏈傳播,然後利用這些知識來獲得你想要的行爲。

  • 只要你保持環比將繼續下降「成功」路徑上有成功
  • 環比將繼續向下「失敗」路徑,只要你保持在具有故障
  • 如果「成功」函數拋出一個錯誤或返回拒絕承諾,那麼環比將繼續向下「失敗」路徑
  • 如果「失敗」函數返回一個值或履行諾言,那麼環比將繼續下降「成功「路徑。

此行爲是在Promises/A+標準的心臟。

如果你與一個單個的端.fail,然後再編寫鏈(如果我理解正確的話),你會得到你所尋求的行爲。

Q().then(function() { 
    return Q.ninvoke(myObject, 'save'); 
}).then(function() { 
    add object another object to db referenced to myObject 
}).then(function() { 
    do somethinng else 
}).fail(functon (err) { 
    res.status(400).send(err.message); 
}); 

在此,在.then鏈中的任何點故障將導致propageted承諾通過.then S的其餘直下降和由終端.fail被抓住。

這具有的優點在以上的問題,其具有多個交織.fail是代碼。這種模式可以起作用,但是您需要引入一種機制來處理失敗後的多重「失敗」行爲。在不正常的情況下可能是合適的,但一般來說它會被認爲是混亂的。

您可能需要在失敗處理程序中唯一的其他事情是在不同類型的失敗之間進行區分並相應地執行。這是相當微不足道的作爲正式可變err可以被測試,例如,在一個開關的情況下的結構。你似乎不需要這樣的測試,因爲在所有情況下失敗的行爲都是相同的。