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

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

我正在为一个游戏编写计时器。我决定使用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(勾选(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中,所以我不必传递任何参数来勾选。