我正在努力弄清楚如何正确通过承诺泡沫错误。
具体来说,我所说的是存在嵌套承诺的情况。我希望能够隐含地将resolve
和reject
函数传递给嵌套的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
回调}?
答案 0 :(得分:0)
在回答评论和重复的问题时,我可以写下以下答案:
使用A
或new Promise()
包装Promise.all
的返回值(或任何返回不同Promise的函数的返回值)是不必要的。
相反,只需致电return otherPromise().then(handler)
,reject
上的otherPromise
功能就可以与A().catch(handler)
一起使用。
当new Promise()
用于包装此返回值时,内部承诺上的reject
函数将不冒泡到A().catch()
。但是,使用Promise.all
包装返回值将冒泡错误。