我的服务器发送事件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)
```