簡體   English   中英

為什么在Promise.all()之后不調用onRejected,其中數組中包含的Promise.reject()傳遞給Promise.all()?

[英]Why is onRejected not called following Promise.all() where Promise.reject() included in array passed to 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() .then(onFulfilled, onRejected)不調用Promise.all()

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來處理err部分,則返回了一個字符串。 這不是拒絕的理由。

要真正使Promise.all()拒絕你需要一個錯誤無論是在發生resolvedrejected的部分.then

鑒於此,如果您返回被拒絕的承諾,它將拒絕:

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

console.log(err)

return Promise.reject(err)

或者,您可以引發錯誤: https : //jsfiddle.net/9gprLc7q/2/

console.log(err)

throw new Error(err)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM