只保留解决并忽略被拒绝的promise中的值
Keep the values only from the Promises that resolve and ignore the rejected
我有一个数组的承诺,每一个承诺是一个要求废弃一个网站。大多数都解决了,但也可能有一两个拒绝,例如网站关闭。我想要的是忽略被拒绝的承诺,只保留已经解决的承诺的值。
Promise.all
不适合这种情况,因为它需要所有的承诺来解决。
Promise.some()
不是我想要的,因为我事先不知道有多少承诺会解决。
Promise.any()
与Promise.some()
相同,计数为1。
这个案子怎么解决?我正在使用Bluebird实现
当然,你很幸运,蓝鸟已经做到了:
Promise.settle(arrayOfPromises).then(function(results){
for(var i = 0; i < results.length; i++){
if(results[i].isFulfilled()){
// results[i].value() to get the value
}
}
});
您也可以使用较新的reflect
调用:
Promise.all(arrayOfPromises.map(function(el){
return el.reflect();
})).filter(function(p){
return p.isFulfilled();
}).then(function(results){
// only fulfilled promises here
});
这与@Benjamin解决方案相同,但具有更优雅的数组操作:
这段代码将忽略被拒绝的承诺结果,所以你可以运行10个承诺并将结果作为3个元素的数组:
Promise.settle(arrayOfPromises).then(function(results){
return results.filter(function (result) {
return result.isFulfilled();
}).map(function (result) {
return result.value();
});
}).then(function(results){
console.log("here you go:", results);
});
这里将忽略被拒绝的承诺,但将null作为结果,所以如果你运行10个承诺,你将得到一个包含10个元素的数组,被拒绝的值将为null:
Promise.settle(arrayOfPromises).then(function(results){
return results.map(function (result) {
return result.isFulfilled()? result.value() : null;
});
}).then(function(results){
console.log("here you go:", results);
});
相关文章:
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 在promise中为回调添加超时并拒绝
- angular ui bootstrap:当模式关闭时,promise被解析/拒绝
- JavaScript Promise 解析并拒绝函数调用序列
- 带有拒绝调用和抛出错误的Promise构造函数
- Bluebird Promise.any() 提前拒绝
- 节点 js,使用带有 Q promise 的猫鼬不调用拒绝函数
- 在ES6 Promise中允许多次解析/拒绝的原因是什么
- 拒绝promise时停止代码执行
- AngularJS/Karma-测试函数返回已解决或拒绝的promise
- 当你想要所有结果而不管是否被拒绝时,用什么代替Promise.all()
- Dojo.request.post-返回的promise说"拒绝”;,但服务器似乎已经接受了请求
- Bluebird Promise.all-多个承诺完成了成功和拒绝的汇总
- Angular-返回$modal promise并拒绝它
- node.js Q promise不会通过拒绝处理程序传播异常
- 当action使用promise时,indexOf拒绝在值突变中工作
- 的承诺.all - resolve回调会被触发,尽管Promise被拒绝
- 稍后在TypeScript中解析或拒绝Promise
- 在promise .race中第一个promise被解析(拒绝)后执行是否结束
- new Promise和Promise的区别.在bluebird中解决/拒绝