我有两种功能,一种是通过单击开始按钮触发的
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
功能?
答案 0 :(得分:5)
尽管您应该重新考虑算法,因为当前的功能对于启动和停止游戏有点复杂。
但是,此解决方案背后的想法是将所有timeouts和interval对象存储在一个数组中。发生重置时,您将遍历每个对象并将其停止。
然后重置阵列。
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
停止循环;