我正在使用dojo promises,延迟。我有一个承诺/所有捕获所有承诺的东西,只有当它们都成功或者其中任何一个返回错误时才会执行。有没有办法让一个承诺列表只在所有承诺执行时返回(无论它们是成功还是错误)?我想列出一些失败的列表,而不是“其中一个失败”。
我想我可以解决所有延期,错误或成功,但这有点挫败了目的......
答案 0 :(得分:4)
有两种选择:
Dojo承诺没有提供明确管理此案例的工具ala'蓝鸟的Promise.settle
或何时when.settle
。所以我们必须自己创建它:
function settle(promises){ // assuming "dojo/promise/all" and "dojo/Deferred"
var d = new Deferred();
var countdownLatch = promises.length;
var results = [];
promises.forEach(function(p, i){
p.then(function(v){
results[i] = {state: "fulfilled", value: v};
countdownLatch--;
if(countdownLatch === 0) d.resolve(results);
}, function(err){
results[i] = {state: "rejected", err: err };
countdownLatch--;
if(countdownLatch === 0) d.resolve(results);
});
});
return d; // dojo mixes deferred and promises because it's an older API
}
这可以让你这样做:
settle(myPromisesArray).then(function(results){
results.forEach(function(res){
console.log(res.state); // you can `if` on it to check a particular promise
});
});
更现代的方法是创建一个反射方法,该方法接受一个承诺并返回一个承诺,该承诺始终满足包含先前承诺状态的对象。这是Bluebird正在探索的方向,可能会包含在V3中。
function reflect(promise){
return promise.then(function(v){ return {state: "fulfilled", value: v }; },
function(e){ return {state: "rejected" , error: e }; });
}
这会让您进行不同的聚合,这会使settle
来自私有案例上方:
function settle(promises){
return all(promises.map(reflect));
}
答案 1 :(得分:0)
正如您所发现的那样,只要其中一个承诺的承诺被取消,就会实现dojo / promise / all。
你想要dojo / DeferredList - 可以配置它来做你想要的,你可以从中提取promise对象。