пытаясь немедленно остановить таймер JS - PullRequest
1 голос
/ 30 апреля 2020

Я запрограммировал базовый c ММ: таймер обратного отсчета SS в JS, который должен немедленно остановиться, как только оставшиеся секунды равны нулю.

function startTimer() {
    let timer = qs("select");
    remainingSeconds = timer.options[timer.selectedIndex].value;
    let timerDisplay = formatTimer(remainingSeconds);
    id("time").innerHTML = timerDisplay;

    timerId = setInterval(advanceTimer, 1000);
  }

  function formatTimer(timeValue) {
    let minutes = Math.floor(timeValue / 60);
    let seconds = remainingSeconds % 60;

    if (minutes < 10) {
      minutes = "0" + minutes;
    }

    if (seconds < 10) {
      seconds = "0" + seconds;
    }
    return minutes + ":" + seconds;
  }

  function advanceTimer() {
    if (remainingSeconds === 0) {
      clearInterval(timerId);
      //end the game logic here
      console.log("times up!");
    } else {
      remainingSeconds--;
      console.log("tick");
      id("time").innerHTML = formatTimer(remainingSeconds);
    }
  }

Проблема, с которой я сталкиваюсь сейчас пытается заставить функцию advanceTimer() останавливаться после того, как остальная частьSeconds уменьшается с 1 до 0. При тестировании функции с начального значения, например, 3 минуты (180 секунд), функция advanceTimer() вызывается 181 раз вместо ровно 180 раз. Как я могу изменить поведение функций, чтобы больше не вызывать advanceTimer, когда остающиеся секунды равны нулю.

1 Ответ

1 голос
/ 30 апреля 2020

Попробуйте добавить timerId объявление вне функции, чтобы сохранить область действия

let timerId;

function startTimer() {
  ...

  timerId = setInterval(advanceTimer, 1000);
}
...