Dojo承诺所有 - 但等待所有承诺返回

时间:2014-11-19 01:50:10

标签: javascript ajax dojo promise

我正在使用dojo promises,延迟。我有一个承诺/所有捕获所有承诺的东西,只有当它们都成功或者其中任何一个返回错误时才会执行。有没有办法让一个承诺列表只在所有承诺执行时返回(无论它们是成功还是错误)?我想列出一些失败的列表,而不是“其中一个失败”。

我想我可以解决所有延期,错误或成功,但这有点挫败了目的......

2 个答案:

答案 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对象。