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

7d7tgy0s  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(408)

我正在为一个游戏写计时器。我决定使用redis和websockets在多个设备上保持计时器的一致性。我有一个函数可以工作,但是当我用settimeout或setinterval递归调用它时,我会得到一个“range error:maximum call stack size exceeded”。我想不出如何绕过这个错误。有人知道这是否与节点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)
}
sczxawaw

sczxawaw1#

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

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

您应该提供一个将由 setInterval() 本身:

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

ps:当前的实现应该是 setTimeout() 而不是 setInterval() 因为你的 setInterval() 每秒钟执行一次回调(回调设置另一个计时器,它执行一个回调设置另一个计时器,它执行一个。。。。你看到另一个循环了吗?)

相关问题