setInterval的替代项,用于仅在函数执行时重复间隔



我的服务器发送事件web应用程序需要任何解决方案或替代方案。我看到有人在SSE中使用setInterval,这很好,但我有一个函数需要一些时间才能完全运行。这是一种导致我的网络应用程序无法完美工作的情况。

以这个例子为根本原因。setTimeout将仅在1秒后执行。setInterval应该运行该函数,然后等待1/10秒,然后重复它

setInterval( () => {
setTimeout( function () { console.log("ok")}, 1000)
}, 100)

但在短短1秒内,setInterval就运行了该函数10次。

ok
ok
ok
ok
ok
ok
....
....

这是实际的代码。即使我设置了一些条件,该函数仍然运行了3次。如果我把setInterval时间设置为10秒,那么它就可以正常工作了。

在javascript中,我可以为服务器发送的事件实现任何替代方案吗。

setInterval( () => {
if ( pu[id] > 0 && pu[id]) {
connection.query(`SELECT * FROM files WHERE pack_id = ${id} ORDER BY uploaded_at DESC LIMIT ${pu[id]}`, (error, results) => {
if (error) {
console.log(error)
} else {
console.log("SEND") // printing 3 times
res.status(200).write(`data: ${JSON.stringify(results)}nn`)
}
pu[id] = 0
})
}
}, 10)

如果我理解正确,您的setInterval时间比解决查询所需的时间短吗?

如果是这样的话,您可以使用setTimeout递归地调用函数内部的函数,这将稳定解析之间的间隔。

//query takes 1 second to resolve
function mockQuery () {
return new Promise((resolve, reject)=> {
setTimeout(()=> resolve(console.log("ok")),1000);
});
}
async function makeQueryCall(){
await mockQuery()
//after resolve it is called again 1/10th of a second later
setTimeout(()=> makeQueryCall(), 100);
}
makeQueryCall();

在您的代码中,这可能会转换为

async function makeQueryCall() {
if(pu[id] > 0 && pu[id]) {
try {
let results = await connection.query(`SELECT * FROM files WHERE pack_id = ${id} ORDER BY uploaded_at DESC LIMIT ${pu[id]}`); 
console.log("SEND") // printing 3 times
res.status(200).write(`data: ${JSON.stringify(results)}nn`)     
} catch (e) {
console.log(e)
}
setTimeout(()=> makeQueryCall(),10)
}
}
makeQueryCall();

不过可能需要调整。

在您在setInterval中使用setTimeOut的示例中,它完全正常工作。setInterval在一秒内运行10次,即在1秒内调用setTimeOut 10次。现在这些setTimeOut在堆栈中,一旦它们有1秒的超时,它们就会执行。

因此,在1秒后,您将看到10 console.log((。

说到你的实际问题,setTimeOut和setInterval不是这样做的方法。为此,您必须使用"Promise"。

setInterval和setTimeout都是异步的,这意味着不阻塞在下面的代码中,setTimeout((将在1秒内被调用10次,第一次超时回调也称为函数(({console.log("ok"(将在1000ms后被调用,然后1100ms用于第二次回调,依此类推

setInterval( () => {
setTimeout( function () { console.log("ok")}, 1000)
}, 100)
```

最新更新