【问题标题】:Nested ES6 promises - outer func error not caught嵌套的 ES6 承诺 - 未捕获外部 func 错误
【发布时间】:2018-10-16 07:21:08
【问题描述】:

我是 ES6 和一系列承诺的新手。我的情况是原始调用站点调用了一个函数(1),然后调用了另一个函数(2)。尝试让函数 2 和函数 1 根据成功或错误返回一个承诺。

这是一些示例,人为的代码:

function level2(data) {
  return new Promise((resolve, reject) => {
    reject('fail')
  })
}

function level1(info) {
  level2('abc').then((response) => {
    return new Promise((resolve, reject) => {
      resolve('success')
    })
  })
}

level1('thing').then((response) => {
  console.log('response2 ' + response)
}).catch(e => {
  console.log('error2 ' + e)
})

我能够成功使用一级承诺。但是当涉及到链式或嵌套式 Promise 时,我并没有正确使用它,所以使用 Promise 的最外层并没有捕捉到错误。

设置 Promise 以使两个函数(1 级和 2 级)都可以向调用者返回成功或失败的正确方法是什么?

在示例函数 (level1) 中,函数 (level2) 的错误是否会向外冒泡?

【问题讨论】:

    标签: javascript ecmascript-6 promise es6-promise


    【解决方案1】:

    您需要获得level1 才能返回承诺。

    {
      // level2 reject:
      function level2(data) {
        return new Promise((resolve, reject) => {
          reject('fail inside level2')
        })
      }
    
      function level1(info) {
        return level2('abc').then((response) => {
          return new Promise((resolve, reject) => {
            resolve('success')
          })
        })
      }
    
      level1('thing').then((response) => {
        console.log('response2 ' + response)
      }).catch(e => {
        console.log('error2 ' + e)
      });
    }
    
    {
      // level1 reject:
      function level2(data) {
        return new Promise((resolve, reject) => {
          resolve('ok');
        })
      }
    
      function level1(info) {
        return level2('abc').then((response) => {
          return new Promise((resolve, reject) => {
            reject('fail inside level1')
          })
        })
      }
    
      level1('thing').then((response) => {
        console.log('response2 ' + response)
      }).catch(e => {
        console.log('error2 ' + e)
      });
    }

    【讨论】:

      【解决方案2】:

      一开始你不需要这些:

       new Promise((resolve, reject) =>  reject('fail'))
      

      有它的快捷方式:

       Promise.resolve("success")
       Promise.reject("fail");
      

      设置 Promise 以使两个函数(1 级和 2 级)都可以向调用者返回成功或失败的正确方法是什么?

      要么使用Promise.allPromise.race 来统一它们,要么将其中一个promise 返回到另一个promise 的then 链中,以便它们变得扁平(就像你所做的那样)。

      在示例函数 (level1) 中,函数 (level2) 的错误是否会向外冒泡?

      是的。

      【讨论】:

      • 你能提供一个Promise.all的例子吗?在我的情况下,我有点想对原始调用者隐藏第二个承诺的知识,如果原始调用者不需要知道嵌套承诺,那么他们不应该
      • @xta jup,在您的情况下,您的解决方案是正确的。但是还有一些其他情况是 Promise.all 达到了类似的目的。
      猜你喜欢
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2017-10-13
      • 2022-12-19
      • 2018-04-17
      • 2021-11-28
      • 2018-05-12
      • 2019-08-20
      相关资源
      最近更新 更多