2015-11-20 86 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