给出
var promises = [Promise.resolve("a"), Promise.reject("b")];
Promise.all(promises.map(function(p, index) {
return p.then(function(data) {
console.log("inside .map()", data, "index", index)
return data
}, function(err) {
console.log(err);
return err
})
}))
.then(function(complete) {
console.log("all promises after .map()", complete)
}, function(err) {
console.log("err", err)
})
为什么在onRejected
之后.then(onFulfilled, onRejected)
没有调用Promise.all()
?
jsfiddle https://jsfiddle.net/9gprLc7q/
答案 0 :(得分:3)
您需要了解处理拒绝会导致将承诺放回成功路径。一种方法是重新抛出失败处理程序,如下所示:
var promises = [Promise.resolve("a"), Promise.reject("b")];
Promise.all(promises.map(function(p, index) {
return p.then(function(data) {
console.log("inside .map()", data, "index", index)
return data
}, function(err) {
console.log(err);
// RE-THROW!!
throw err;
})
}))
.then(...
如果拒绝处理程序的目的仅仅是记录,那么您可以将其移出链:
Promise.all(promises.map(function(p, index) {
// MOVE ERROR HANDLER OUTSIDE OF CHAIN
p.catch(function(e) { console.log(e); });
return p.then(function(data) {
console.log("inside .map()", data, "index", index)
return data
})
}))
.then(...
答案 1 :(得分:1)
你在这里做的是这样的事情:
https://jsfiddle.net/9gprLc7q/5/
var notRejectedPromise =
Promise.reject("b")
.then((resolved) => resolved, (err) => err)
var promises = [Promise.resolve("a"), notRejectedPromise];
Promise.all(promises)
.then(function(complete) {
console.log("all promises after .map()", complete)
}, function(err) {
console.log("err", err)
})
但是决定通过返回任何err
处理错误部分,你返回了一个字符串。这不是拒绝的理由。
要实际导致Promise.all()
拒绝,您需要在resolved
的{{1}}或rejected
部分发生错误
鉴于此,如果您返回被拒绝的承诺,它将拒绝:
https://jsfiddle.net/9gprLc7q/3/
.then
到
console.log(err)
或者您可以抛出错误:https://jsfiddle.net/9gprLc7q/2/
return Promise.reject(err)
到
console.log(err)