gpt4 book ai didi

javascript - Dojo promise all——但是那会等待所有的 promise 返回

转载 作者:行者123 更新时间:2023-11-29 18:11:29 25 4
gpt4 key购买 nike

我正在使用延迟的 dojo promises。我有一个 promise/all 捕获所有的 promise,并且只在它们全部成功或其中任何一个返回错误时执行。有没有办法得到一个只在所有执行时返回的 promise 列表(无论它们是成功还是错误)?我想要一个失败的列表,而不是“其中一个失败”。

我想我可以解决所有的延迟、错误或成功,但这有点违背了目的...

最佳答案

有两种选择:

解决

Dojo promises 没有提供任何工具来管理这种情况,比如 bluebird 的 Promise.settle 或 when 的 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
});
});

反射(reflection)

一种更现代的方法是创建一个 reflect 方法,该方法接受一个 promise 并返回一个 promise ,该 promise 始终满足包含先前 promise 状态的对象。这是 Bluebird 正在探索的方向,可能会包含在 V3 中。

function reflect(promise){
return promise.then(function(v){ return {state: "fulfilled", value: v }; },
function(e){ return {state: "rejected" , error: e }; });
}

这会让你做不同的聚合,这使得 settle 从上面一个私有(private)案例:

function settle(promises){
return all(promises.map(reflect));
}

关于javascript - Dojo promise all——但是那会等待所有的 promise 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27007565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com