簡體   English   中英

Q中的Node.js中止鏈在不同點

[英]Node.js Abort chain in Q in different point

我在Q中有很長的檢查鏈,當錯誤出現時我會中斷它:

我曾研究過如何中止Node.JS中失敗的Q承諾以及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,REJECTED),但是僅調用OK()。 如果可能,我想避免將代碼分成3個不同的函數。

據我所知,您不需要做任何特別棘手的事情,只需了解成功和失敗如何通過.then鏈傳播,然后利用這些知識來獲得所需的行為即可。

  • 只要您繼續取得成功,連鎖店就會沿着“成功”之路繼續下去
  • 只要您繼續失敗,鏈條將繼續沿着“失敗”的道路前進
  • 如果“成功”函數拋出錯誤或返回被拒絕的承諾,則鏈將繼續沿“失敗”路徑前進
  • 如果“失敗”函數返回值或已兌現的承諾,則鏈將繼續沿“成功”路徑前進。

此行為是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 ,它具有.fail 可以使該模式起作用,但是一旦處理了故障,您就需要引入一種機制來抑制多個“失敗”行為。 在不尋常的情況下,這可能是適當的,但總的來說,它會被認為是混亂的。

在失敗處理程序中,您可能需要做的唯一另一件事就是區分不同類型的失敗並采取相應的措施。 可以測試形式變量err ,例如在切換用例結構中,這是微不足道的。 您似乎不需要測試,因為在所有情況下對失敗的操作都是相同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM