Javascript Redis递归:超过最大调用堆栈大小
我正在为一个游戏编写计时器。我决定使用Redis和Web套接字在多个设备上保持计时器的一致性。我有一个可以工作的函数,但是当我用setTimeout或setInterval递归调用它时,我会得到一个“范围错误:超出了最大调用堆栈大小”。我想不出如何绕过这个错误。有人知道这是否与node redis publish方法的阻塞性质有关吗?我已经附上下面的代码Javascript Redis递归:超过最大调用堆栈大小,javascript,node.js,typescript,redis,node-redis,Javascript,Node.js,Typescript,Redis,Node Redis,我正在为一个游戏编写计时器。我决定使用Redis和Web套接字在多个设备上保持计时器的一致性。我有一个可以工作的函数,但是当我用setTimeout或setInterval递归调用它时,我会得到一个“范围错误:超出了最大调用堆栈大小”。我想不出如何绕过这个错误。有人知道这是否与node redis publish方法的阻塞性质有关吗?我已经附上下面的代码 const tick = (time: Time, publisher: RedisClient) => { let newTime
const tick = (time: Time, publisher: RedisClient) => {
let newTime: Time = { minutes: 0, seconds: 0}
if(time.seconds === 0) {
if(time.minutes === 0) {
newTime = {minutes: 4, seconds: 0}
} else {
newTime = {minutes: time.minutes - 1, seconds: 59}
}
} else {
newTime = {...time, seconds: time.seconds - 1}
}
let ticker = setInterval(tick(newTime, publisher), 1000)
publisher.publish("scoring:timer", `${newTime.minutes}: ${newTime.seconds}`)
publisher.on("message", function(_chanel, message) {
if(message === "STOP") {
clearInterval(ticker)
}
})
}
function startTimer() {
const publisher = createClient()
publisher.publish("scoring:events", "START")
let time = {
minutes: 4,
seconds: 0
}
tick(time, publisher)
}
在设置导致无限循环的间隔之前,您正在执行
tick()
:
setInterval(勾选(newTime,publisher),1000);
您应该提供一个将由setInterval()
本身执行的函数:
setInterval(()=>tick(newTime,publisher),1000);
PS:当前的实现应该使用
setTimeout()
而不是setInterval()
,因为setInterval()
每秒执行一次回调(并且回调设置另一个计时器,该计时器执行一个回调,该回调设置另一个计时器,执行一个……您看到另一个循环了吗?)在设置导致无限循环的间隔之前,您正在执行tick()
:
setInterval(勾选(newTime,publisher),1000);
您应该提供一个将由setInterval()
本身执行的函数:
setInterval(()=>tick(newTime,publisher),1000);
PS:当前的实现应该使用
setTimeout()
而不是setInterval()
,因为setInterval()
每秒执行一次回调(并且回调设置另一个计时器,该计时器执行一个回调,该回调设置另一个计时器,执行一个……您看到另一个循环了吗?)谢谢您的回复。这个解决方案确实有效,但我最终只是将时间值存储在Redis中,所以我不必传递任何参数来勾选。谢谢您的回复。该解决方案确实有效,但我最终只是将时间值存储在Redis中,所以我不必传递任何参数来勾选。