2015-11-20 30 views
2

我在node.js中使用promise對象。我有一個目標:承諾對象的錯誤鏈令人困惑

var Send = { 
    send(post_ids) { 
     return Post.findById(post_ids) 
      .then((posts) => { 
       return sendArticlesToWechat(setupArticles(posts)); // sendArticlesToWechat is also a promise 
      }) 
      .then((result) => { 
       console.log("RESULT: " + result); 
      }) 
      .catch((err) => { 
       console.error("SEND ERROR: " + err); 
       return err; 
      }); 
     }, 
} 

export default Send; 

,並調用它在另一個文件的方法:當發生錯誤時

Send.send(req.body) 
    .then((result) => { 
     console.log("CALL SEND: " + result); 
    }) 
    .catch((err) => { 
     console.error(err); 
    }); 

,我有兩個輸出:

SEND ERROR: ERROR: // error message 
CALL SEND: ERROR: // error message 

sendArticlesToWechat()出現此錯誤函數返回。因爲這也是一個承諾,所以我可以catch其外部的錯誤。這是我的預期。

當我打電話給Send.send()時,我預計會得到catch()中的錯誤,但錯誤出現在then()方法中。

根據輸出結果,錯誤確實從前面的catch()返回,爲什麼我不能保留它在catch()

回答

1

問題出在你最後的catch()。因爲你return err,你導致承諾解決而不是被拒絕。如果你想返回被拒絕的承諾,那麼要麼刪除catch()或再次引發err

var Send = { 
    send(post_ids) { 
     return Post.findById(post_ids) 
      .then((posts) => { 
       return sendArticlesToWechat(setupArticles(posts)); // sendArticlesToWechat is also a promise 
      }) 
      .then((result) => { 
       console.log("RESULT: " + result); 
      }) 
      .catch((err) => { 
       console.error("SEND ERROR: " + err); 
       //return err;//converts from reject to resolved 
       throw err; 
      }); 
     }, 
} 

export default Send; 
+0

是的,它的工作原理。謝謝。那麼你認爲哪一個更好?刪除catch()或throw err? –

+0

這可能會有所不同,但在這種情況下,我會用'throw err'去。我會在'Send'對象中執行日誌記錄,以防調用代碼忘記寫入catch()。這樣,至少日誌會顯示發生錯誤。 – pgreen2