为什么在 Promise.all() 之后没有调用 onJect,其中数组中包含的 Promise.reject() 传
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
在Promise.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()
拒绝,您需要在.then
的resolved
或rejected
部分中发生错误
鉴于此,如果您返回被拒绝的承诺,它将拒绝:
https://jsfiddle.net/9gprLc7q/3/
console.log(err)
自
return Promise.reject(err)
或者,您可以抛出错误:https://jsfiddle.net/9gprLc7q/2/
console.log(err)
自
throw new Error(err)
相关文章:
- Promise没有;t返回对象的数组
- $q.all当输入数组中的一项不是promise时,Typescript检查器失败
- 当数组中的某个函数没有返回promise时,我可以使用$q.all吗
- promise数组中的WinJS返回
- 使用Node中的Q promise库对值数组顺序调用/执行相同的函数;并返回带有结果的新数组/集合
- 序列promise链与数组数据,如何解析promise链
- Promise和Promise.all(数组)在数组实现之前执行
- 如果数组中的值为false,则破坏Promise
- 在多维数组中获取promise的结果
- 在使用promise数组时使用jQuery
- 包含 promise 的对象数组在 for 循环中混乱
- ngResource.myfunc().$promise.then 返回空数组
- ES6 Promise.all() promise 数组的奇怪分辨率
- 如何使用 Parse.promise javascript 定义一个承诺数组并获取结果数组 [parse.com]
- 节点.js不能使用 promise、Mongoose 和 GET 请求推送到全局数组
- 将一个q promise数组拆分为多个数据包,并依次运行这些数据包
- $when.apply在promise数组中的某个promise被延迟时不工作
- 在PouchDB/Barket.js中推送promise数组之前修改对象的值
- 为什么,如果“$q.all”没有返回一个promise数组,则是一个未抛出的异常
- 当promise数组的长度不确定时,Q.js Q.all()