Kru*_*ate 5 javascript setinterval node.js promise async-await
我有一个基于 Promise 的函数,我想以固定的时间间隔调用它,可以说每 60 秒一次。但我也想确保只有在先前调用的函数完全执行时才调用该函数,并且我想无限期地继续执行此操作
function fun(){
return new Promise((resolve,reject)=>{
//Some database queries which may or may not complete in 60 seconds
resolve("done")
})
}
setInterval(()=>{
fun().then(d=>{
console.log(d)
})
},60000)
Run Code Online (Sandbox Code Playgroud)
上面的代码不会检查之前调用的函数是否完成。但我想确保
class AsyncQueue {
constructor() {
this.queue = null;
}
push(task) {
// If we have task in query, append new at the end, if not execute immediately
// Every task appended to existing queue will be executed immediately after previous one is finished
return this.queue = this.queue ? this.queue.then(() => task()) : task();
}
}
const task = (id) => () => new Promise((resolve) => {
console.log('Task', id, 'started');
// Random time betwen 500-1300ms
const time = Math.round(Math.random() * 800 + 500);
setTimeout(() => {
console.log("Finished task '" + id + "' after " + time + "ms");
resolve();
}, time);
});
const queue = new AsyncQueue();
let id = 0;
// This will push new task to queue every 1s
setInterval(() => {
console.log("Pushing new task", ++id);
queue.push(task(id));
}, 1000);Run Code Online (Sandbox Code Playgroud)
当然我们可以不使用类来实现
let queue;
function push(task) {
return queue = queue ? queue.then(() => task()) : task();
}
// or
const push = (task) => queue = queue ? queue.then(() => task()) : task();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |