Promise.all在同一个数组上

时间:2015-02-18 02:11:43

标签: javascript promise

我正在研究基于promises的代码,它可以做到这样的事情:

var promises = [];
function eventHandler(e)
{
    promises.push(getSomeData(e.opts));

    Promise.all(promises)
        .then(...)
        .then(function()
        {
            promises = [];
        });
}

基于Promise.all的承诺不应该执行eventHandler被调用的次数吗?

编辑:这里发生的事情是事件处理程序被调用了几次而之前的承诺还没有完成。我需要一种方法来扩展承诺列表,并且只有一个最终then运行。

1 个答案:

答案 0 :(得分:0)

更新,OP已澄清他们希望等待所有承诺在原始承诺解决之前添加 - .all不会这样做。相反,你可以使用可靠的链接。

var p = Promise.resolve([]); // create empty array promise, `when` in dojo
function eventHandler(e){
    p = p.then(function(value){ // chain off the last value
        return getSomeData(e.opts).then(function(single){
            return value.push(single); // add to the array
        });
    });
}

每次调用eventHandler时,这都会向数组添加一个项目 - 每次.then它都会获得当前值,而不是最后一个 - 但你可以{ {1}}它和你一样多次。例如,自链接时间以来没有发生任何事件时,您可以链接:

.then

或者只要你愿意等待:

var p2 == p;
p.then(function(results){
    if(p !== p2) return p; // wait in case more events happened, but no more
    return results;
});

你有一个竞争条件,你正在调用function noMoreAddedInterim(){ var p2 = p; return p.then(function(results){ if(p2 !== p) return noMoreAddedInterim(); // changed else return results; // no more added }); } 并且之后只清理数组,所以许多承诺都会在结果中出现两次或更多次。

相反 - 将Promise.all放入临时变量promises,并在.all之前清除promises。既然你一次添加一个promises,你可能甚至不需要这里的.then

此外,您应该附加一个.catch处理程序,以免错过任何错误。