Javascript - интервал не очищается

1

Я делаю игру с таймером.

То, что я пытаюсь сделать, - когда игра начинается через gameState.init(), таймер запускается через timer.counter("start") - но когда нажата кнопка "перезапустить", таймер останавливается и сбрасывается через timer.counter("reset").

Таймер возвращается к 0, но продолжает подсчитывать и не очищаться.

Цените любое понимание, которое я могу получить. Заранее спасибо!

var gameState = {
    init: function(){
        var difficultyLevel = document.querySelector('input[name="level"]:checked').value;
        conditions.difficulty(difficultyLevel);
        startFrame.classList.remove("active");
        shuffleCards();
        timer.counter("start");
        display.moves(movesAllowed);
    },
    restart: function(){
        startFrame.classList.add("active");
        reset.allCards(cards);
        shuffleCards();
        timer.counter("reset");
        matchCount = 0;
        totalMoves = 0;
        movesAllowed = 0;
        timeAllowed = 0;
        time = 0;
    }
}

var timer = {
    counter: function(status){
        var clock = document.querySelector(".timer");

        var incrementTime = setInterval(function(){
                time++;
                var minutes = Math.floor(time / 60);
                var seconds = Math.floor(time % 60);
                if(seconds < 10){
                    clock.innerText = minutes + ":0" + seconds;
                } else {
                    clock.innerText = minutes + ":" + seconds;
                }
            }, 1000);

        var stopTime = function(){
            clearInterval(incrementTime);
        }

        if(status === "start"){
            alert("counting");
        }

        if(status === "reset"){;
            alert("reset");
            stopTime();
        }
    }
}
  • 0
    Вы создаете новый интервал каждый раз, когда вызываете timer.counter (status), поэтому, конечно, он не остановит предыдущий созданный вами интервал.
Теги:

1 ответ

4
Лучший ответ

Два вопроса:

  • Переменная, которая содержит интервал, incrementTime, является локальной для функции counter. Как только функция counter заканчивается, incrementTime получает сбор мусора, потому что ссылка на этот интервал больше не сохраняется. Вместо этого вам потребуется переменная интервала.

  • Вы устанавливаете новый интервал каждый раз, когда вызывается counter. Вы, вероятно, следуешь только установить интервал, когда status будет start, иначе старый интервал будет продолжать работать и не будете останавливаемыми (переназначение интервала setInterval назначенный не проясняет интервал):

    let interval; // <---- Persistent
    var timer = {
      counter: function(status){
        var clock = document.querySelector(".timer");
        if (status === 'start') {
          interval = setInterval(() => { // <---- Assign to persistent variable
            time++;
            var minutes = Math.floor(time / 60);
            var seconds = Math.floor(time % 60);
            if(seconds < 10){
              clock.innerText = minutes + ":0" + seconds;
            } else {
              clock.innerText = minutes + ":" + seconds;
            }
          }, 1000);
          alert("counting");
        } else if(status === "reset"){
          var stopTime = function(){
            clearInterval(interval); // <---- Clear persistent variable
          }
          alert("reset");
          stopTime();
        }
      }
    }
    

(Было бы немного более изящным, чтобы функции stopTime и интервалов были постоянными, а не воссоздавались каждый раз, когда они нужны, например, вы могли бы назначать их свойствам timer)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню