[英]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/
您需要了解,處理拒絕會導致將承諾重新放到成功道路上。 一種解決方法是重新拋出故障處理程序,如下所示:
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()
拒絕你需要一個錯誤無論是在發生resolved
或rejected
的部分.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.