如何停止调用函数JS

时间:2019-01-20 15:13:03

标签: javascript settimeout setinterval

我有两种功能,一种是通过单击开始按钮触发的

Canceled

和第二个,单击重置按钮后将被调用

function startGame() {
  setInterval(setCellPosition, 3000);
  setTimeGame = setTimeout(startGame, 2000);
  setTime();
};

function resetGame() { scoreBox.innerHTML = "0"; timeBox.innerHTML = "60"; liveBox.innerHTML = "3"; clearTimeout(setTimeGame) }; 函数不起作用。值(得分,时间,实时)被重置,但是resetGame功能不会停止。如何解决?如何停止startGame功能?

2 个答案:

答案 0 :(得分:5)

尽管您应该重新考虑算法,因为当前的功能对于启动和停止游戏有点复杂。

但是,此解决方案背后的想法是将所有timeoutsinterval对象存储在一个数组中。发生重置时,您将遍历每个对象并将其停止。

然后重置阵列。

const sts = []; //all set timeouts and intervals

function startGame() {
  sts.push(setInterval(setCellPosition, 3000));
  sts.push(setTimeout(startGame, 2000));
  setTime();
};

function resetGame() {
  scoreBox.innerHTML = "0";
  timeBox.innerHTML = "60";
  liveBox.innerHTML = "3";
  sts.forEach(clearTimeout);
  sts.length = 0;
};

根据MDN:

  

返回的timeoutID是一个正整数,用于标识   通过调用setTimeout()创建的计时器;这个值可以是   传递给clearTimeout()来取消超时。

     

了解setTimeout()和setInterval()可能会有所帮助   共享相同的ID池,并且clearTimeout()和   clearInterval()在技术上可以互换使用。为了清楚起见,   但是,您应该尝试始终匹配它们,以免在混淆时   维护您的代码。

答案 1 :(得分:1)

如果用gameOver标志和包含while的{​​{1}}循环替换setInterval,例如:

setTimeout

...然后在let gameOver = false; function startGame() { while(gameOver == false){ setTimeout(setCellPosition, 3000); } // Note: It seems strange that you're recursively calling `startGame` here setTimeGame = setTimeout(startGame, 2000); setTime(); }; 函数中,可以设置resetGame停止循环;