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

IT技术 javascript promise
2021-03-11 21:37:53

给定的

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个回答

您需要了解处理拒绝会导致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);

    // 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(...
我触及了这一点,但对其进行了编辑。谢谢你的措辞比我做得更好 :D
2021-04-20 21:37:53

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

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 部分err,您返回了一个字符串。这不是拒绝的理由。

要实际导致Promise.all()拒绝,您需要在resolvedrejected部分发生错误.then

鉴于此,如果您返回一个被拒绝的Promise,它将拒绝:

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

console.log(err)

return Promise.reject(err)

或者你可以抛出一个错误:https : //jsfiddle.net/9gprLc7q/2/

console.log(err)

throw new Error(err)
仅使用throw err jsfiddle.net/9gprLc7q/6返回预期结果,不使用new Error(err)
2021-04-28 21:37:53
@guest271314 也许这会对jsfiddle.net/9gprLc7q/5有所帮助Promise.reject当您return err在原始代码中执行时, err 部分返回一个字符串而不是 a
2021-04-29 21:37:53
为什么删除.then()at .map()return 预期结果 jsfiddle.net/9gprLc7q/4为什么是rejectedPromise转换为resolved Promise
2021-05-03 21:37:53
@guest271314 这是因为您从未将 a 附加.then到被拒绝的Promise。所以现在不是返回"b",这不是拒绝,而是返回自己Promise.reject("b"),这是一个被拒绝的值。
2021-05-10 21:37:53
@guest271314 在这里你去stackoverflow.com/questions/9156176/... :D
2021-05-13 21:37:53