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

Why is onRejected not called following Promise.all() where Promise.reject() included in array passed to Promise.all()?

本文关键字:Promise 数组 reject 包含 调用 all 之后 为什么 onJect      更新时间:2023-09-26

给定

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)
})

为什么onRejectedPromise.all()之后没有在.then(onFulfilled, onRejected)被召唤?

JSFIDDLE https://jsfiddle.net/9gprLc7q/

https://jsfiddle.net/9gprLc7q/

您需要了解,处理拒绝会导致承诺重新回到成功道路上。一种方法是重新抛出失败处理程序,如下所示:

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

你在这里真正做的是这样的:

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()拒绝,您需要在.thenresolvedrejected部分中发生错误

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

https://jsfiddle.net/9gprLc7q/3/

console.log(err)

return Promise.reject(err)

或者,您可以抛出错误:https://jsfiddle.net/9gprLc7q/2/

console.log(err)

throw new Error(err)