为什么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()resolvedrejected部分发生错误

鉴于此,如果您返回拒绝的承诺,它将拒绝:

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(...