【问题标题】:Chain error throws in multi level promises Node.js链错误引发多级承诺 Node.js
【发布时间】:2019-07-05 09:12:42
【问题描述】:

我想链接来自不同级别承诺的不同错误,并且在最后一次捕获时有一个错误

假设我们有以下情况:

this.methodOne().then( responseOne =>{

    this.methodTwo(responseOne ).then( responseTwo =>{
       console.log(responseTwo );
     }).catch(err => {
      // send err to last catch
      throw err;
     })

 }).catch(err => {
  // Show err one or two
  console.log(err)
})

但不工作

谢谢

【问题讨论】:

  • 一般来说,只有在 (a) 你想检查错误(记得重新抛出错误) (b) 你想注入自定义错误消息(更改错误)时,才需要内部捕获.message 并重新抛出,或者抛出一个新的错误)(c)你想注入一个默认值来代替应该传递到成功路径的内容(返回值)。否则,不要抓住。

标签: javascript node.js promise try-catch


【解决方案1】:

您必须返回 throw 传播的内部承诺。仅当您从 .then() 处理程序返回它们时,内部承诺才会添加到链中。当你这样做时,它们被插入到链中,它们的已解决或拒绝状态是外部承诺链得到的。没有return,内部promise链只是它自己独立的promise链,根本不连接到外部promise链。

所以,改变这个:

this.methodOne().then( responseOne =>{

    this.methodTwo(responseOne ).then( responseTwo =>{
       console.log(responseTwo );
     }).catch(err => {
      // send err to last catch
      throw err;
     })

 }).catch(err => {
  // Show err one or two
  console.log(err)
})

到这里:

this.methodOne().then(responseOne => {

    // ADD return on next line to return inner promise
    //    to add this inner promise chain to the outer chain
    return this.methodTwo(responseOne ).then(responseTwo => {
       console.log(responseTwo );
       return responseTwo;       // return this so it becomes the resolved
                                 //   value of parent chain too
     }).catch(err => {
       // send err to last catch
       throw err;
     });

 }).catch(err => {
  // Show err one or two
  console.log(err)
})

【讨论】:

  • @BorisDetry - 由于您可能是这里的新手,如果这回答了您的问题,您可以通过单击答案左侧的复选标记向社区表明这一点。这也将为您在网站上赢得一些声誉积分,以遵循正确的程序。
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 2018-09-23
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多