我有一系列的承诺,每个承诺都是要求废弃一个网站。他们中的大多数人解决但可能是一两个拒绝的情况,例如该网站已关闭。我想要的是忽略被拒绝的承诺,只保留已经解决的承诺的价值。
Promise.all
不是因为这需要所有的承诺来解决。
Promise.some()
不是我想要的,因为我事先不知道有多少承诺会解决。
Promise.any()
是相同的 Promise.some()
数量为1。
这个案子怎么解决?我正在使用 蓝鸟实施。
我有一系列的承诺,每个承诺都是要求废弃一个网站。他们中的大多数人解决但可能是一两个拒绝的情况,例如该网站已关闭。我想要的是忽略被拒绝的承诺,只保留已经解决的承诺的价值。
Promise.all
不是因为这需要所有的承诺来解决。
Promise.some()
不是我想要的,因为我事先不知道有多少承诺会解决。
Promise.any()
是相同的 Promise.some()
数量为1。
这个案子怎么解决?我正在使用 蓝鸟实施。
当然,幸运的是蓝鸟已经这样做了:
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解决方案相同,但具有更优雅的数组操作:
此代码将忽略被拒绝的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个promise,你将把结果作为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);
});