为什么onRejected没有调用Promise.all()数组中包含的Promise.reject()传递给Promise.all()?
特定
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/
https://jsfiddle.net/9gprLc7q/
你在这里所做的是这样的:
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
来处理错误部分,你返回了一个string。 这不是拒绝的理由。
要真正导致Promise.all()
拒绝,您需要在Promise.all()
的resolved
或rejected
部分发生错误
鉴于此,如果您返回拒绝的承诺,它将拒绝:
https://jsfiddle.net/9gprLc7q/3/
console.log(err)
至
return Promise.reject(err)
或者,你可以抛出一个错误: https : //jsfiddle.net/9gprLc7q/2/
console.log(err)
至
throw new Error(err)
你需要明白,处理被拒绝的结果是把承诺重新放在成功的道路上。 解决这个问题的一个方法是重新抛出失败处理程序,如下所示:
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(...
如果拒绝处理程序的目的仅仅是logging,那么你可以将其移出链:
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(...