Как я могу заставить clearInterval остановить мой таймер?

У меня есть 2 таймера, которые я хочу запустить отдельно. «таймер» связан с первой функцией «timePassed» и должен считать до тех пор, пока жизненные характеристики моего существа не упадут до 0, после чего он должен остановиться. Оно делает. Однако мой второй таймер «timer2» связан со второй функцией «restart». Это не останавливается, когда статистика достигает 0, чего я хочу. Так же, как первый.

Я подозреваю, что это может быть связано с моим запуском «timePassed» (функция 1) в функции «перезагрузка» 2. Я чувствую, что таймер работает слишком быстро для интервалов в 1 секунду, так что это еще одна подсказка. Но я не уверен, так как я новичок во всем этом. В принципе, как я могу остановить «таймер2», как только статистика достигнет 0?

//first function that works fine

function timePassed(){
    message();
    screen();
    i++;
    answer();
    decrease();
    changeStar();
    changeDonut();
    changeHeart();
    if (health === 0 || happiness === 0 || hunger === 0){      
      dodo();
     clearInterval(timer);
          }
  }var timer= setInterval(timePassed, 1000);

//second function whose timer isn't working correctly

 function restart() {
   i=0;
   message();
   health = 4;
   happiness = 4;
   hunger = 4;
   screen();
   timePassed();
   if (health === 0 || happiness === 0 || hunger === 0){      
      dodo();
       clearInterval(timer2);    
      }
    } var timer2 = setInterval(timePassed, 1000);

Я попытался назначить var timer2 как для timePassed() (как показано), так и для restart(). Если я использую перезагрузку(), мой счетчик подпрыгивает вверх и вниз, никогда не уменьшаясь настолько, чтобы вызвать clearInterval.

Если я удалю оператор «if» из перезагрузки() и/или timer2, перезагрузка() просто останется без обратного отсчета.


person Lorna Roberts    schedule 29.02.2020    source источник
comment
Я обновил свой ответ, чтобы, надеюсь, дать вам больше информации о том, что еще может быть не так с вашим кодом. Дайте мне знать, если я могу помочь вам в дальнейшем.   -  person Coldark    schedule 29.02.2020


Ответы (1)


После некоторых размышлений вот проблемы, с которыми вы столкнулись:

  • restart() никогда не войдет в свой блок if, потому что вы переназначаете переменные, которые он проверяет заранее, поэтому второй интервал никогда не будет очищен
  • вы используете два одинаковых таймера, поэтому каждую секунду timePassed() вызывается дважды
  • вы снова вызываете timePassed() в restart(), что не обязательно вызывает проблемы, но наверняка увеличивает значение i сразу после того, как вы установили его до 0 (проблема счетчика отказов)

Итак, отвечая на ваш вопрос - чтобы остановить timer2, как только статистика достигнет 0, вы можете просто переместить clearInterval(timer2) в блок if внутри timePassed() и т.е. вызвать timePassed() до сброса статистики и счетчика, или просто очистить оба интервала в restart() без вызова timePassed(). Все это означает, что вы будете очищать оба интервала, что может быть не тем, что вам нужно.

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

person Coldark    schedule 29.02.2020
comment
Спасибо за ответ. Я использую перезагрузку (), когда вы нажимаете кнопку перезагрузки, которая запускает ее. В первой функции, функция уменьшения () изменяет эти повторно инициализированные переменные вниз, поэтому она определенно достигает 0 (или, по крайней мере, функция 1) во время выполнения dodo (). Кажется, я начинаю понимать, что вы имеете в виду. Я попытаюсь разделить timer() на 2, чтобы попытаться избежать того, чтобы второй блок не запускался... Я вернусь через некоторое время! - person Lorna Roberts; 29.02.2020
comment
@LornaRoberts Очень сложно угадать, что именно делает ваш код и какого общего результата вы хотели бы достичь (кроме рабочего таймера, конечно). Если бы вы могли поделиться немного больше, может быть, я мог бы помочь больше. - person Coldark; 29.02.2020
comment
Спасибо @Coldark. Очень признателен. Сократите мой код, чтобы попытаться сделать его актуальным. По сути, я пытаюсь сделать виртуального питомца. Простые таймеры и т. д. Каждую секунду он запускается, выбрасывается случайное число, которое определяет, какая из 3 жизненных характеристик (голод, здоровье, счастье) уменьшается на единицу. Игрок может добавить их обратно, нажав на значки, например. таблетка, бутерброд, коробка для игрушек. Все, что я хочу, это таймер, чтобы сообщить игроку, как долго длилась игра, прежде чем один из показателей жизни упадет до нуля. - person Lorna Roberts; 01.03.2020
comment
В настоящее время функция function1 продолжает работать (чего раньше не было). Функция 2 также работает. Я согласен, что на самом деле должен быть только один таймер. Но я не уверен, как этого добиться, как будто у меня нет таймера, подключенного к функции2, он вообще не работает. - person Lorna Roberts; 01.03.2020
comment
@LornaRoberts Что именно должен делать этот код (в чем его идея)? Я не могу вам помочь, если вы не проясните это. - person Coldark; 01.03.2020
comment
@Coldark- извини. Думал, что объяснил. Функция 2 делает в основном то же самое, что и функция 1, за исключением того, что статистика жизни сбрасывается до 4 перед ее запуском, поскольку это происходит автоматически для функции 1. Все, что мне нужно, это отдельный таймер, который запускается либо при загрузке экрана (функция 1), либо после нажатия кнопки перезагрузки. (функция 2), которая дает мне переменную (i), которую я затем использую через innerhtml для отображения на экране, как только показатель жизни становится равным 0. например вы прожили 2 дня. Я даже не уверен, что мой оператор if вообще выполняется в функции 1 или 2 сейчас. Это больше, что вы имеете в виду об идее, стоящей за этим? - person Lorna Roberts; 01.03.2020
comment
@LornaRoberts Пожалуйста, взгляните на это - person Coldark; 01.03.2020
comment
@Coldark- Я не могу поверить, сколько работы ты проделал! Большое спасибо. Единственная проблема в том, что я все еще пытаюсь добиться этого с помощью одной кнопки. Я бы предпочел иметь только одну кнопку для простоты. Это слишком трудно достичь? Благодаря вашей скрипке я смог остановить свой счетчик, используя timer = null. Но перезагрузка () просто повторяет предыдущее обновленное значение timePassed (), которое я считаю. - person Lorna Roberts; 02.03.2020
comment
Давайте продолжим это обсуждение в чате. - person Coldark; 02.03.2020