Redis递归:超过了最大调用堆栈大小



我正在为游戏编写计时器。我决定使用Redis和Web套接字来保持多个设备之间的计时器一致性。我有一个函数可以工作,但是当我用setTimeout或setInterval递归调用它时;范围错误:超过了最大调用堆栈大小;。我不知道如何绕过这个错误。有人知道这是否与node-redispublish方法的阻塞性质有关吗?我附上了下面的代码。

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(tick(newTime, publisher), 1000);

您应该提供一个将由setInterval()本身执行的功能:

setInterval(() => tick(newTime, publisher), 1000);

PS:目前的实现应该使用setTimeout()而不是setInterval(),因为你的setInterval()每秒都会执行一次回调(你的回调设置了另一个定时器,它执行了一个回调设置了一个定时器……你看到另一个循环了吗?(

最新更新