Class 使用 setTimeout() 和 setInterval() 的方法在重复调用时意外工作

Class method that uses setTimeout() and setInterval() works unexpectedly on repeated calls

tldr:在第一轮 lose() 工作正常,但在后续调用中,当玩家重新启动并再次失败时,会立即调用 retry() 并且 msgRepeater() 仅在用户出现时显示选择退出。

当用户输掉这场 node.js 游戏时,会调用 class 方法 lose()。

lose() 首先运行另一个方法 msgRepeater(),它在设定的时间间隔内重复一条消息。

然后 lose() 运行另一个方法 retry(),以提示用户重新启动或退出游戏(此方法在 retry() 内的 setTimeout() 之后运行,以允许 msgRepeater() 先完成)。

在第一轮中,这工作正常,但在连续的调用中,当玩家重新开始并再次失败时,会立即调用 retry() 并且仅当用户选择退出时才会重复消息(但不会持续很长时间并按重播次数累计)。

我的 setInterval and/or setTimeout 方法有问题吗?我被卡住了,任何决议将不胜感激!

//***Retry***
retry() {
    const retry = () => {
      while(this.gameOver && !this.exit) {
        let input = prompt('Play Again? y/n: ');
        if(input==='y') {
          this.play();
        }
        else if(input==='n') {
          this.exit=true;
        }
        else {
          console.log(
            'I don\'t understand,\ndo you want to play again? y/n: '
          )
        };
      }
    }
    setTimeout(retry, 5000);
  };

  //***Repeated Message***
  msgRepeater(text) {
    const newMsg = () => console.log(text);
    const msgInterval = setInterval(newMsg, 400);
    const endMsgInterval = () => {
      clearInterval(msgInterval); 
    }
    setTimeout(endMsgInterval, 4000);
  }

  //***Lose***
  lose() {
    this.msgRepeater('You Lose!');
    this.retry();
  }

中的问题在于试图清除 Node 中的超时(我认为超时 returns 是一个属性对象,而不是像往常一样只是一个递增的数字)。我找到的一个解决方案是以通常的方式清除超时,然后将超时变量重新分配给一个空对象。虽然它可能有点乱,但它确实有效,我当然会对其他解决方案感兴趣。

const callback = () => {
  //body of function here
  clearTimeout(myTimeout); 
  myTimeout = {};
}
const myTimeout = setTimeout(callback,1000);