Bluebird Promise.all-多个承诺完成了成功和拒绝的汇总
Bluebird Promise.all - multiple promises completed aggregating success and rejections
今天有人向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的代码,但只报告了一个结果和一个错误。该错误导致进程停止。
如果我们取消注释,我们会得到类似的行为。这一次,只报告错误。任何成功都不会进入那个时代(这是可以理解的)。
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
等其他操作。
相关文章:
- 尽管链接成功并已成功下载,但未找到NPM模块
- 在流星上使用微信js-sdk时出现拒绝权限错误
- 在另一个函数成功结束后调用该函数
- 在ajax成功后,cluetip不适用于首次点击活动元素
- jQuery成功函数中的ajax成功函数
- 在Nodejs中Express输入DEBUG=app时权限被拒绝/bin
- jQuery触发器点击未从AJAX成功工作
- 如何使用jQuery可编辑插件检查ajax是否成功完成
- 执行ajax成功函数-jQUERY
- 简单的ES6承诺问题-交换解决和拒绝参数
- 解析云代码错误:解析.错误{代码:141,消息:“未调用成功/错误”}
- javascript第三个XMLHttpRequest被拒绝.但前两个是允许的
- 如何从servlet获取数据到ajax成功
- 成功回调永远不会被JSONP请求调用
- 将表单张贴到MailChimp,但显示动态成功页面
- 在$q服务中捕获拒绝而不触发成功回调
- 为什么$q.当在Angular中后跟$q.拒绝时.js会导致成功
- 拒绝$http成功的承诺
- 知道操作是成功还是被承诺拒绝
- Bluebird Promise.all-多个承诺完成了成功和拒绝的汇总