Как перестать вызывать функцию JS - PullRequest
0 голосов
/ 20 января 2019

У меня есть две функции, одна из которых вызывается нажатием кнопки запуска

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 не останавливается. Как это исправить? Как остановить функции startgame?

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Если вы замените свой setInterval флагом gameOver и циклом while, содержащим 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 вы можете установить gameOver = true для остановки цикла;

0 голосов
/ 20 января 2019

Хотя вы должны переосмыслить свой алгоритм, так как то, что у вас есть в данный момент, немного сложно для запуска и остановки вашей игры.

Однако идея этого решения состоит в том, чтобы сохранить все ваши таймауты и интервал объектов в массиве.Когда происходит сброс, вы перебираете все объекты и останавливаете его.

Затем вы сбрасываете массив.

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 () совместно используют один и тот же пул идентификаторов, и что clearTimeout () и clearInterval () технически может использоваться взаимозаменяемо.Для ясности, однако, вы должны стараться всегда сопоставлять их, чтобы избежать путаницы при обслуживании вашего кода.

...