仅保留来自解析和忽略被拒绝的Promises的值

时间:2015-05-18 17:18:55

标签: javascript promise

我有一系列承诺,每个承诺都是要求废弃网站。他们中的大多数解决但可能是一个或两个拒绝的情况,例如该网站已关闭。我想要的是忽略被拒绝的承诺,只保留已经解决的承诺的价值。

Promise.all不适用于那种情况,因为它需要解决所有承诺。

Promise.some()不是我想要的,因为我事先并不知道有多少承诺会解决。

Promise.any()与计数1的Promise.some()相同。

这个案子怎么解决?我使用的是Bluebird implementation

2 个答案:

答案 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);
});