По аналогии с setTimeout, который выполняется только один раз, в JavaScript можно запустить повторное выполнение функции через фиксированные промежутки времени. Для этого существует функция setInterval.
Если ты тут впервые, то сначала советую разобраться как работает setTimeout.
Запуск JS таймера setInterval
В JS у setInterval те же параметры, что и у setTimeout.
callback- функция которую нужно вызыватьdelay- задержка в миллисекундах
Первым параметром передаем функцию callback, вторым — задержку delay. После выполнения, setInterval запустит таймер, который будет асинхронно запускать callback каждые delay миллисекунд.
console.log('START!');
setInterval(() => console.log('bingo'), 2000);
В консоли появится сообщения START! и после него, каждые две секунды будет появляться с новой строки слово bingo.
START!
bingo
bingo
bingo
...
В функции внутри setInterval можно использовать внешние переменные.
const delay = 2;
let i = 1;
console.log('START!');
setInterval(() => {
console.log(`сообщение ${i}, появилось на экране через ${delay * i++} секунд`), delay * 1000);
В консоли появятся такие сообщения:
START!
сообщение 1,
появилось на экране через 2 секунд
сообщение 2,
появилось на экране через 4 секунд
сообщение 3,
появилось на экране через 6 секунд
сообщение 4,
появилось на экране через 8 секунд
Остановка JS таймера setInterval
Чтобы остановить setInterval в JavaScript, нужно использовать функцию clearInterval. Чтобы понять как очистить интервал в JS, разберемся детальнее с тем как он работает:
-
setIntervalвозвращает объект, которые хранит все данные о периодическом выполнении функции:Timeout { _idleTimeout: 2000, _idlePrev: [TimersList], _idleNext: [TimersList], _idleStart: 141, _onTimeout: [Function], _timerArgs: undefined, _repeat: 2000, _destroyed: false, [Symbol(refed)]: true, [Symbol(asyncId)]: 5, [Symbol(triggerId)]: 1 } -
этот объект можно сохранить в переменную
-
когда интервал больше не нужен, передаем объект
Timeoutв функциюclearInterval. Таймер остановлен и асинхронная функция больше выполняться не будет.
Пример кода:
const delay = 2;
const limit = 2;
let i = 1;
console.log('START!');
const limitedInterval = setInterval(() => {
console.log(`сообщение ${i}, появилось на экране через ${delay * i++} секунд`)
if (i > limit) {
clearInterval(limitedInterval);
}
}, delay * 1000);
Анонимная стрелочная функция внутри setInterval выполнится только дважды. Потом условие i > limit станет истинным и интервал очистится вызовом clearInterval(limitedInterval).
START!
сообщение 1, появилось на экране через 2 секунд
сообщение 2, появилось на экране через 4 секунд