Setinterval js как остановить?
Друг говорит достаточно убрать функцию, а таймер наверн продолжит вы зывать, а ещё забыл, он запускается кнопкой, помогите понять где останавливать, кнопка пока одна
Работа и карьера
Программирование
Компьютеры и связь
Учёба и образование
Развлечения
Ваш вопрос
Друг говорит достаточно убрать функцию, а таймер наверн продолжит вы зывать, а ещё забыл, он запускается кнопкой, помогите понять где останавливать, кнопка пока одна
Останавливайте интервал через clearInterval, передавая сохранённое значение, которое вернул setInterval. Удобно отделить запуск от остановки и не создавать второй интервал, пока первый действует:
let timer = null;
function start() {
if (timer !== null) return;
timer = setInterval(() => {
console.log('Тик');
}, 1000);
}
function stop() {
if (timer === null) return;
clearInterval(timer);
timer = null;
}
В обработчике кнопки запуска вызывайте start, а в обработчике остановки вызывайте stop. Проверка на null отражает состояние, которое выбрали вы сами. В браузере идентификатор обычно числовой, а в Node.js возвращается объект таймера, поэтому полезно не привязывать общую логику к предположению о положительном числе.
Если нажать запуск несколько раз, приведённая проверка оставит один работающий интервал. Без неё каждый вызов setInterval создавал бы отдельный таймер. Простая перезапись timer не остановила бы предыдущий, а последующий clearInterval смог бы очистить только тот, чей идентификатор сохранился.
Удаление функции из другого объекта или изменение переменной с её именем тоже не является командой отмены таймера. Интервал уже получил ссылку на переданную функцию. Управлять им нужно через идентификатор либо через более высокий механизм, который делает такую очистку внутри.
Отмена касается будущих срабатываний. Если обработчик уже начал асинхронную загрузку, она сама по себе не исчезнет после clearInterval. При необходимости отменяйте такую операцию её собственным способом и не применяйте устаревший результат. Если выполнение работы может занимать дольше периода, иногда удобнее планировать следующий setTimeout после завершения текущей операции, чтобы не создавать перекрывающиеся запросы.
☐ Запишите возвращаемое setInterval значение в переменную, доступную обработчику остановки.
☐ Для прекращения повторных запусков вызовите clearInterval с этим значением. Передача самой функции вместо идентификатора не является правильной остановкой.
☐ После остановки сбросьте свою переменную, например в null. Это помогает вашей логике понимать, что активного интервала сейчас нет.
☐ Перед новым запуском проверьте состояние. Повторное нажатие кнопки может создать второй интервал, а перезаписанная переменная будет помнить только последний.
☐ Учтите уже начатую работу. clearInterval предотвращает следующие вызовы таймера, но не отменяет автоматически сетевой запрос или другую асинхронную операцию, которую предыдущий вызов уже успел запустить.
☐ При уничтожении компонента или завершении соответствующего режима очищайте принадлежащий ему интервал.
4o
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Ответить на вопрос