Как выполнять код через равные промежутки времени
Короткий ответ
setInterval() вызывает функцию снова и снова с заданной паузой. clearInterval() её останавливает:
let count = 0;
const timer = setInterval(() => {
count++;
console.log('tick', count);
if (count === 3) clearInterval(timer);
}, 200);Результат:
tick 1
tick 2
tick 3Обратный отсчёт
Тот же приём отсчитывает время назад и останавливается на нуле:
let seconds = 3;
const timer = setInterval(() => {
console.log(seconds > 0 ? seconds : 'Start!');
if (seconds === 0) clearInterval(timer);
seconds--;
}, 100);Результат:
3
2
1
Start!Цепочка setTimeout
Для запросов лучше планировать следующий вызов только после завершения предыдущего. Тогда вызовы не накладываются друг на друга:
async function poll() {
const response = await fetch('/api/status');
showStatus(await response.json());
setTimeout(poll, 5000);
}
poll();Частая ошибка
Без clearInterval() интервал работает вечно, даже когда он больше не нужен. Всегда сохраняйте идентификатор, чтобы его можно было остановить:
const timer = setInterval(() => {}, 1000);
clearInterval(timer);
console.log('interval stopped');Результат:
interval stoppedФункции из этого ответа
- setInterval — Выполняет функцию снова и снова с заданным интервалом.
- clearInterval — Останавливает повторяющийся setInterval.
- setTimeout — Выполняет функцию один раз через заданное время.