只保留解决并忽略被拒绝的promise中的值

Keep the values only from the Promises that resolve and ignore the rejected

本文关键字:拒绝 promise 保留 解决      更新时间:2023-09-26

我有一个数组的承诺,每一个承诺是一个要求废弃一个网站。大多数都解决了,但也可能有一两个拒绝,例如网站关闭。我想要的是忽略被拒绝的承诺,只保留已经解决的承诺的值。

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