问题 保留仅解析和忽略被拒绝的Promise的值


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

Promise.all 不是因为这需要所有的承诺来解决。

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

Promise.any() 是相同的 Promise.some() 数量为1。

这个案子怎么解决?我正在使用 蓝鸟实施


8230
2018-05-18 17:18


起源

如果你可以添加超时,他们应该最终“解决”。所以我想知道你是否想要定期测试,看看有多少人已经解决了? - Dinesh
@Dinesh好吧,那不是一个可靠的解决方案,如果它没有,如果是 resource 是几个小时?应该有一个更可靠的解决方案。 - Avraam Mavridis


答案:


当然,幸运的是蓝鸟已经这样做了:

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

15
2018-05-18 18:23



thx,安定完成了这项工作。 - Avraam Mavridis
@Benjamin Gruenbaum - 这个问题(Promise.reflect())是你不能在then块中使用promise对象的属性(例如objectname.itsproperty)。 - Peeter Kokk


这与@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);
});

0
2017-10-21 16:53