亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號