嵌套的ES6承诺 - 未捕获外部函数错误

时间:2018-05-06 09:08:34

标签: javascript ecmascript-6 promise es6-promise

我是ES6&一系列的承诺。我的情况是原始呼叫站点调用一个函数(1),然后调用另一个函数(2)。试图同时具有功能2& function 1根据成功或错误返回一个promise。

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

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)
})

我能够成功使用一级承诺。但是当谈到链接或嵌套承诺时,我没有正确使用它,所以消耗承诺的最外层没有捕获错误。

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

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

2 个答案:

答案 0 :(得分:3)

您需要让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)
  });
}

答案 1 :(得分:1)

起初你不需要这些:

Gender_Female

有快捷方式:

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

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

使用 Promise.resolve("success") Promise.reject("fail"); Promise.all来统一它们或将其中一个承诺返回到另一个承诺的链中,这样它们就会变得扁平(就像你一样)。

  

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