每 X 秒发起一个承诺

Vic*_*ico 2 javascript asynchronous promise

我从 3 个不同的 API 中提取数据,并且希望将所有这些结果合并到一个数组中。

我想做到这一点的正确方法是使用 Promise:

var function1 = new Promise((resolve, reject)=>{
    ...
    resolve();
});
var function2 = new Promise((resolve, reject)=>{
    ...
    resolve();
});
var function3 = new Promise((resolve, reject)=>{
    ...
    resolve();
});

Promise.all([function1, function2, function3]).then(function(values){
    // Values are all here!
});
Run Code Online (Sandbox Code Playgroud)

我怎样才能再次调用所有的承诺并通过Promise.all每一秒加入它们?

我试过了

setInterval(function(){
    Promise.all([function1, function2, function3]).then(function(values){
        // Values are all here and up to date!
    });
}, 1000)
Run Code Online (Sandbox Code Playgroud)

没有成功。

感谢您的帮助!

Dem*_*ack 5

每次要调用 Promise 对象时,都需要重新创建它们:

var function1 = (resolve, reject)=>{
    console.log('calling 1');
    resolve();
};
var function2 = (resolve, reject)=>{
    console.log('calling 2');
    resolve();
};
var function3 = (resolve, reject)=>{
    console.log('calling 3');
    resolve();
};

setInterval(function(){
    Promise.all([new Promise(function1), new Promise(function2), new Promise(function3)]).then(function(values){
        console.log('alldone');
    });
}, 1000)
Run Code Online (Sandbox Code Playgroud)

这是因为 Promise 仅在创建时执行,否则在循环中您只是附加一个新的 then() 方法,该方法不会调用您的 API。

编辑: 请注意,setInterval如图所示,每 1 秒将向您的 API 发出三个请求。这是一个相当快的速度,并且可能会给您带来麻烦,除非您API网络都非常快。更明智的方法可能是仅在处理了前一个请求后才触发下一个请求。为此,只需将调用替换setInterval为:

var callback = function(){
    Promise.all([new Promise(function1), new Promise(function2), new Promise(function3)]).then(function(values){
        console.log('all done');
        setTimeout(callback, 1000);
        console.log('next call successfully enqued');
    });
};
setTimeout(callback, 1000);
Run Code Online (Sandbox Code Playgroud)

感谢 Kevin B 指出了这一点。