为什么在Promise.all()之后没有调用onRejected,其中数组中包含的Promise.reject()传递给Promise.all()?

时间:2016-01-27 15:56:03

标签: javascript promise

给出

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/

2 个答案:

答案 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)