我正在研究基于promises的代码,它可以做到这样的事情:
var promises = [];
function eventHandler(e)
{
promises.push(getSomeData(e.opts));
Promise.all(promises)
.then(...)
.then(function()
{
promises = [];
});
}
基于Promise.all
的承诺不应该执行eventHandler
被调用的次数吗?
编辑:这里发生的事情是事件处理程序被调用了几次而之前的承诺还没有完成。我需要一种方法来扩展承诺列表,并且只有一个最终then
运行。
答案 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处理程序,以免错过任何错误。