Хорошо, прежде чем отмечать это как дубликат, прочтите, пожалуйста, полностью.
Итак, я новичок в JS. Пытаюсь сделать таймер. Предполагается, что каждый раз, когда вызывается функция timerReset()
, интервал должен быть перезапущен. У меня есть это:
intervalID = setInterval(wallsPingTimer, wallsTime); //INTERVAL IS DEFINED ON STARTUP
wallsTime = 10000;
wallsToggle = true
function timerReset() {
if (wallsToggle === true) {
console.info('Timer has been reset');
clearInterval(intervalID);
intervalID = setInterval(wallsTimerPing, wallsTime);
}
if (wallsToggle === false) {
console.info('Timer is disabled');
}
}
function wallsPingTimer() {
//some code
}
Таймер запускается при запуске intervalID = setInterval(wallsTimerPing, wallsTime)
, но старый таймер никогда не останавливается. В итоге происходит то, что wallsTimerPing()
запускается на нескольких таймерах снова и снова. clearInterval(intervalID)
никогда не останавливает оригинал, и я сбит с толку.
Я просмотрел множество других подобных вопросов, и, похоже, я делаю это правильно (очевидно, нет). В чем дело?
Показанный код выглядит правильно. Как вы используете timerReset
и как заключаете, что интервал не сбрасывается?
за clearInterval следует setInterval в вашем коде, поэтому функция wallTimerPing никогда не перестанет выполнять
@ScottMarcus Обновлено, WallTimerPing - это функция. @charlietfl timerReset
выполняется другими функциями. Это бот в discord.js, поэтому, когда используется определенная команда, она выполняется. @Stakvino таймер должен быть перезапущен, это сделано намеренно. Эта часть работает, старый интервал просто продолжается ...
Вы определили wallTime ПОСЛЕ того, как вы его используете?
@epascarello WallTime определяется в начале скрипта, я поместил его вверху, чтобы показать это.
По-прежнему не показано, где изменяется wallsToggle
или как вы вызываете timerRest. Действительно нужен минимальный воспроизводимый пример, который воспроизводит проблему
Откуда вы знаете, что это старый таймер, который все еще работает, а не новый, вы очищаете старый, а затем сразу же передаете те же значения новому. Опубликуйте свой полный код, если вам нужна помощь.
Похоже, вам нужно показать реальный код.
Пожалуйста, посмотрите мой обновленный ответ, в котором подробно рассказывается о том, что именно ваш код делает в настоящее время, и показаны два шаблона для успешной работы вашего таймера.
Проблема в том, что вы проверяете wallsToggle
на наличие true
или false
(и, возможно, останавливаете таймер), когда timerReset
впервые запускается, и эта функция запускает ваш таймер, который затем вызывает wallsTimerPing
, но timerReset
больше не запускается, и поэтому clearInterval()
останавливается. таймер работы никогда не срабатывает.
Вот пошаговая инструкция:
wallsToggle
установлен на true
timerReset()
называютwallsToggle
протестирован на true
wallsToggle
- это true
, поэтому вводится ветвь true
if
."Timer has been reset"
зарегистрированclearInterval()
вызывается, но таймер еще не запущен, поэтому ничего не происходитsetInterval()
, и по истечении интервала wallsTimerProg()
помещается в очередь событий и запускается новый счетчик интервалов.if
, но wallsToggle
по-прежнему является true
, поэтому его ветвь true
не вводится.timerReset()
завершен.wallsTimerProg()
выполняет.wallsTimerProg()
, что устанавливает wallsToggle
в false
wallsTimerProg()
завершаетсяwallsTimerProg()
не имеет кода, который очищает таймер.Ваш шаблон был бы правильным, если бы таймер рекурсивно вызывал timerReset
, потому что тесты if / then будут запускаться при каждом вызове функции, и clearInterval()
потенциально может получить срабатывание.
let intervalID;
wallsTime = 2000;
wallsToggle = true
function timerReset() {
console.info("wallsToggle is: " + wallsToggle);
// The code that determines if the timer should continue should
// be in the function that will be called repeatedly.
if (wallsToggle === true) {
console.info('Timer has been reset');
intervalID = setInterval(timerReset, wallsTime);
} else { // <-- If a Boolean isn't true, it must be false. No need to check
// Clear the interval when you've determined that you need to stop
clearInterval(intervalID);
console.info('Timer is disabled');
}
// The main code that this function does here
// along with something that would change wallsToggle to false
wallsToggle = false;
}
timerReset();
Но если вы хотите / нуждаетесь в том, чтобы вторая функция вызывалась таймером, вам необходимо переместить код, определяющий, должен ли таймер снова запускаться, в функцию, которую вызывает clearInterval()
, а не в функцию, которая запускается один раз и запускает операцию. .
Вот пример того, как это должно работать:
let intervalID;
wallsTime = 2000;
wallsToggle = true
function wallsTimerPing(){
console.info("wallsToggle is: " + wallsToggle);
// The code that determines if the timer should continue should
// be in the function that will be called repeatedly.
if (wallsToggle === true) {
console.info('Timer has been reset');
} else { // <-- If a Boolean isn't true, it must be false. No need to check
// Clear the interval when you've determined that you need to stop
clearInterval(intervalID);
console.info('Timer is disabled');
}
// The main code that this function does here
// along with something that would change wallsToggle to false
wallsToggle = false;
}
function timerReset() {
intervalID = setInterval(wallsTimerPing, wallsTime);
}
timerReset();
setInterval()
принимает ссылку на функцию в качестве первого аргумента. Что такоеwallsTimerPing
? Обновите свой вопрос, чтобы отобразить весь связанный с ним код.