Таймери
Внутрішній таймер-планувальник браузера дозволяє відкладати виклик функції на певний період часу. Для цього є тайм-аути та інтервали, які контролюють, коли і як часто викликається функція. Таймери реалізовані в браузері, а не вбудовані в мову, і доступні на глобальному об'єкті window
.
Тайм-аут
Метод setTimeout()
дозволяє запланувати запуск функції через певний час.
const timerId = setTimeout(callback, delay, arg1, arg2, ...);
callback
- функція, виконання якої необхідно запланувати.delay
- час в мілісекундах, через який callback-функція буде викликана один раз.
Додаткові аргументи (arg1
, arg2
тощо) будуть передані callback-функції під час виклику. Повертає цифровий ідентифікатор створеного таймера, який використовується для його видалення.
Якщо нам, з будь-якої причини, потрібно скасувати виклик функції всередині тайм-ауту, використовується метод clearTimeout(id)
, який приймає ідентифікатор таймера і очищає (видаляє) його.
const greet = () => {
console.log("Hello!");
};
const timerId = setTimeout(greet, 3000);
clearTimeout(timerId);
Оскільки ми викликали clearTimeout()
, який виповниться раніше, ніж буде викликана функція greet()
, таймер з timerId
буде видалений і реєстрація відкладеного виклику greet()
скасується. Тому в консоль нічого не виведеться.
Інтервал
Метод setInterval()
- це простий спосіб повторення коду знову і знову зі встановленим проміжком часу повторень. Синтаксис і параметри такі самі як у setTimeout()
. На відміну від setTimeout()
, інтервал запускає виконання функції не один раз, а регулярно повторює її через вказаний проміжок часу. Зупинити виконання можна викликом методу clearInterval(id)
.
const timerId = setInterval(callback, delay, arg1, arg2, ...);
Клікаючи на кнопку «Start», запустимо інтервал і будемо кожну секунду виводити в консоль рядок. Використовуємо Math.random()
, щоб рядки були різні. По кліку на кнопку «Stop» викличемо clearInterval()
і передамо ідентифікатор інтервалу, який потрібно зупинити.
Частота спрацьовування лічильника
У браузерного таймера є мінімально можлива затримка. У сучасних браузерах вона коливається приблизно від 0
до 4
мілісекунд. У старіших браузерах затримка може бути більшою і досягати 15
мілісекунд. За стандартом, мінімальна затримка становить 4
мілісекунди, тому різниці між setTimeout(callback, 1)
і setTimeout(callback, 4)
немає.
Таймер може спрацьовувати рідше, ніж зазначено в параметрі delay
, тому що за надто великого завантаження процесора деякі запуски функцій-інтервалів будуть пропущені. Браузери продовжують виконувати тайм-аути та інтервали, навіть якщо вкладка браузера неактивна, але водночас знижують частоту спрацьовування таймерів.