Bluebird Promise.all - 多个承诺完成了聚合成功和拒绝

时间:2014-09-12 21:48:15

标签: javascript node.js promise bluebird

今天有人用蓝鸟提出了一个有趣的案例,处理多项承诺的最佳方法是什么,我们不想停止某项任务或拒绝,而是对检查最终结果感兴趣。一个例子:

var p1 = new Promise(function(f,r){
    setTimeout(function(){
        console.log("p1");
        f("yay");
    }, 100);

});

var p2 = new Promise(function(f,r){
    setTimeout(function(){
        console.log("p2");
        r(new Error("boo"));
    }, 200);

})

var p3 = new Promise(function(f,r){
    setTimeout(function(){
        console.log("p3");
        r(new Error("yay"));
    }, 300);

});

var p4 = new Promise(function(f,r){
    setTimeout(function(){
        console.log("p4");
        f("yay");
    }, 400);

});


//Promise.all([p1,p2, p3, p4]).then(function(p){
//    console.log("Results:",p);
//}).error(function(e){
//    console.log("Error:",e);
//});

Promise.map([p1,p2, p3, p4],function(p){
    console.log("results:",p);
}, {concurrency:10}).error(function(e){
    console.log("Error:",e);
});

在这里,如果我们运行地图或所有被拒绝的承诺将导致处理程序不报告结果。

例如,上面实现的运行Promise.map的结果是:

debugger listening on port 65222
p1
results: yay
p2
Error: [Error: boo]
p3
p4

Process finished with exit code 0

此处执行每个promise的代码,但只报告1个结果和1个错误。该错误导致进程停止。

如果我们取消注释。我们会得到类似的行为。这次,仅报告错误。任何成功都不会成为当时(可以理解)。

debugger listening on port 65313
p1
p2
Error: [Error: boo]
p3
p4

Process finished with exit code 0

鉴于这种行为,最好的方法是实施一个方案,在这个方案中,所有承诺都会运行,并且在任何和所有拒绝情况下都会报告履行承诺的结果?

类似的东西:

Promise.aggregate([p1,p2,p3,p4]).then(function(fulfilled, rejected){
    console.log(fulfilled); //all success
    console.log(rejected); //any and all rejections/exceptions
});

1 个答案:

答案 0 :(得分:35)

您使用.reflect

Promise.all([p1,p2,p3,p4].map(x => x.reflect()).then(results => {
  results.forEach(result => {
     if(result.isFulfilled()){
         // access result.value()
     } else {
         // access result.reason()
     }
  });
});

过去常常使用settle函数来处理传统的数组 - 它由.reflect推广,因为它将聚合与promise检查的概念分开,并允许你执行{ {1}}除了.settle.any等其他操作外,还有其他操作。