我有一系列承诺,每个承诺都是要求废弃网站。他们中的大多数解决但可能是一个或两个拒绝的情况,例如该网站已关闭。我想要的是忽略被拒绝的承诺,只保留已经解决的承诺的价值。
Promise.all
不适用于那种情况,因为它需要解决所有承诺。
Promise.some()
不是我想要的,因为我事先并不知道有多少承诺会解决。
Promise.any()
与计数1的Promise.some()
相同。
这个案子怎么解决?我使用的是Bluebird implementation。
答案 0 :(得分:15)
当然,幸运的是蓝鸟已经这样做了:
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
});
答案 1 :(得分:0)
这与@Benjamin解决方案相同,但具有更优雅的数组操作:
此代码将忽略被拒绝的promise结果,因此您可以运行10个promise并将结果作为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);
});
这里将忽略被拒绝的promise,但会将null作为结果,所以如果你运行10个promises,你将把结果作为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);
});