如何在Promise上冒错误而不在每个级别调用`catch`?

时间:2016-06-08 00:39:50

标签: javascript node.js promise ecmascript-6

我正在努力弄清楚如何正确通过承诺泡沫错误。

具体来说,我所说的是存在嵌套承诺的情况。我希望能够隐含地resolvereject函数传递给嵌套的promise。

通过展示一些代码,我的意思更明显。

以下是我成功使用的内容:

var asyncIsEven = function(number) {
  return new Promise(function(resolve, reject){
      if (number % 2 == 0) { return resolve(number) }
      else { return reject("number is odd") }
  })
}

var A = function (number) {
  return new Promise(function(resolve, reject){
    return asyncIsEven(number).then(resolve).catch(reject)
  })
}

在这里,写then(resolve).catch(reject)似乎没必要。 我知道我可以让函数A返回asyncIsEven(number),但有些情况下我想提供then函数但不需要提供catch函数(反之亦然。)

我尝试了什么:

这有效,但实际上并不是我想要的,因为我没有为嵌套回调提供then处理程序

var A = function (number) {
  return Promise.all([asyncIsEven(number)])
}

// or alternatively
var A = function(number) {
  return asyncIsEven(number)
}

这是我想写的,但它不起作用

var A = function(number) {
  return new Promise(function(resolve, reject) {
    return asyncIsEven(number).then(resolve)
  })
}

当我说它“不起作用”时,我的意思是我不能写下以下内容:

A(2).then(function(number) {
  console.log(`${number} is even`)
}).catch(function(err) {
  console.log(err)
})

因为永远不会调用catch函数。

换句话说 - 如果我定义函数A以返回asyncIsEven(number).then(resolve),我怎样才能将asyncIsEven的错误冒充到reject回调A回调}?

1 个答案:

答案 0 :(得分:0)

在回答评论和重复的问题时,我可以写下以下答案:

使用Anew Promise()包装Promise.all的返回值(或任何返回不同Promise的函数的返回值)是不必要的。

相反,只需致电return otherPromise().then(handler)reject上的otherPromise功能就可以与A().catch(handler)一起使用。

new Promise()用于包装此返回值时,内部承诺上的reject函数将冒泡到A().catch()。但是,使用Promise.all包装返回值冒泡错误。