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)
没有成功。
感谢您的帮助!
每次要调用 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 指出了这一点。
| 归档时间: |
|
| 查看次数: |
5315 次 |
| 最近记录: |