gpt4 book ai didi

javascript - Redis递归:超出最大调用堆栈大小

转载 作者:行者123 更新时间:2023-12-03 06:44:25 25 4
gpt4 key购买 nike

我正在尝试为游戏编写计时器。我决定使用Redis和Web套接字使计时器在多个设备上保持一致。我有一个起作用的函数,但是当我用setTimeout或setInterval递归调用它时,出现“范围错误:超出最大调用堆栈大小”。我不知道如何绕过此错误。有谁知道它是否与node-redis publish方法的阻塞性质有关?我已经附上了下面的代码。

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()每秒执行一次回调(并且您的回调设置了另一个计时器,该计时器执行了设置另一个计时器的回调,该计时器执行了一个....看到吗还有另一个循环吗?)

关于javascript - Redis递归:超出最大调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64358799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com