为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕慕森 2023-05-11 10:16:37
我正在尝试为游戏编写计时器。我决定使用 Redis 和 Web Sockets 来保持定时器在多个设备上的一致性。我有一个可以工作的函数,但是当我使用 setTimeout 或 setInterval 递归调用它时,我得到一个“范围错误:超出最大调用堆栈大小”。我不知道如何绕过这个错误。有谁知道它是否与 node-redis 发布方法的阻塞性质有关?我附上了下面的代码。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)}
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

tick()您在设置导致无限循环的间隔之前执行:

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

您应该提供一个将由其自身执行的函数setInterval()

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

PS:当前的实现应该使用setTimeout()而不是setInterval()因为你setInterval()每秒执行一次它的回调(并且你的回调设置另一个计时器,它执行一个设置另一个计时器的回调,它执行一个......你在那里看到另一个循环吗?)


查看完整回答
反对 回复 2023-05-11
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信