当前位置: 首页 > 面试题库 >

bluebird Promise.all-完成了多个承诺,聚集了成功和拒绝

慎芷阳
2023-03-14
问题内容

今天有人与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);
});

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

例如,如上所述实现的运行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
});

问题答案:

您将使用.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,因为它从一个承诺检查的概念分离聚合,让你做什么.settle没有,但像其他操作.any.some为好。



 类似资料:
  • 如何识别代码中的组合和聚合?特别是在为现有代码绘制类图时? 我知道组成是“HAS-a”关系,聚合是“PART OF”关系。我知道,在组合子类中,实例将随类一起销毁,而在聚合中则不会。 下面是一个 C/CLI 代码 报警 报警.cpp 据我所知,警报和通知之间的联系是组合,因为没有就没有。我说的对吗?如果我是对的,我怎样才能使这段代码在两个类之间具有聚合关系?请问那里的代码示例? 请帮忙。

  • 问题内容: 就我所知,CSS并不是图灵完整的。但是我对CSS的了解非常有限。 CSS Turing完成了吗? 现有的任何草案或委员会是否正在考虑可能不立即实现图灵完整性的语言功能? 问题答案: 您可以在CSS3中对规则110进行编码,因此只要您认为适当的随附HTML文件 和用户交互 是CSS“执行”的一部分,它就可以完成图灵完成。一个不错的实现是可用的,这里包括另一个实现:

  • 每次我想运行或调试我的应用程序,gradle总是错误地构建,但通过Studio成功地构建,但当我想自己生成时,它失败了,太奇怪了。 错误:警告:忽略匿名内部类的InnerClasses属性 错误:(com.iflytek.cloud.a)没有附带 错误:关联的encellsingMethod属性。此类可能是由 错误生成的:编译器没有针对现代.class文件格式。建议的 error:解决方案是使用最

  • 问题内容: 我正在尝试做三个jQuery帖子,将它们的结果设置为它们范围之外的变量,然后在所有三个都返回之后,如果它们成功,则执行另一个函数。现在,我正在嵌套嵌套的回调,如果可能的话,我想摆脱它。 我查看了有关jQuery Promise和Deferreds的文档,但是还没有弄清楚如何将其与$ .post函数一起使用。 我当前的代码: 我想做什么(伪代码): 如果有更优雅的方法,我也很乐意切换代码

  • 问题内容: 据我了解,有三种调用异步代码的方法: 活动,例如 回调,例如 承诺 我找到了节点承诺库,但是我不明白。 有人可以解释什么是诺言,为什么我要使用它? 另外,为什么将它从Node.js中删除? 问题答案: node.js中的承诺承诺会做一些工作,然后有单独的回调,将为成功和失败以及处理超时而执行。在node.js中考虑promise的另一种方式是,它们是可能仅发射两个事件的发射器:成功和错

  • 问题内容: 我有一个这样的函数,它创建一个写流,然后将字符串数组写到文件中。写作完成后,我想使它返回Promise。但是我不知道该如何做。 感谢您的任何评论! 问题答案: 您将要使用构造函数: