Планирование: setTimeout и setInterval
- Методы
setInterval(func, delay, ...args)иsetTimeout(func, delay, ...args)позволяют выполнять func регулярно или только один раз после задержкиdelay, заданной в мс. - Для отмены выполнения необходимо вызвать
clearInterval/clearTimeoutсо значением, которое возвращают методыsetInterval/setTimeout. - Вложенный вызов
setTimeoutявляется более гибкой альтернативойsetInterval. Также он позволяет более точно задать интервал между выполнениями. - Планирование с нулевой задержкой
setTimeout(func,0)или, что то же самое,setTimeout(func)используется для вызовов, которые должны быть исполнены как можно скорее, после завершения исполнения текущего кода. - Браузер ограничивает 4-мя мс минимальную задержку между пятью и более вложенными вызовами
setTimeout, а также дляsetInterval, начиная с 5-го вызова.
Методы планирования не гарантируют точную задержку. Например, таймер в браузере может замедляться по многим причинам:
- Перегружен процессор.
- Вкладка браузера в фоновом режиме.
- Работа ноутбука от аккумулятора.
Всё это может увеличивать минимальный интервал срабатывания таймера (и минимальную задержку) до 300 или даже 1000 мс в зависимости от браузера и настроек производительности ОС.
setTimeout
setTimeout позволяет вызвать функцию один раз через определённый интервал времени.
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...);
💥 Передавайте функцию, но не запускайте её
Разработчики иногда ошибаются, добавляя скобки () после функции. Это не работает, потому что setTimeout ожидает ссылку на функцию.
Вызов setTimeout возвращает «идентификатор таймера» timerId, который можно использовать для отмены дальнейшего выполнения.
let timerId = setTimeout(...);
clearTimeout(timerId);
setInterval
setInterval позволяет вызывать функцию регулярно, повторяя вызов через определённый интервал времени.
Метод setInterval имеет такой же синтаксис как setTimeout
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...);
Чтобы остановить дальнейшее выполнение функции, необходимо вызвать clearInterval(timerId).
Вложенный setTimeout
Есть два способа запускать что-то регулярно. Один из них setInterval. Другим является вложенный setTimeout.
Вложенный setTimeout – более гибкий метод, чем setInterval. С его помощью последующий вызов может быть задан по-разному в зависимости от результатов предыдущего.
Например, необходимо написать сервис, который отправляет запрос для получения данных на сервер каждые 5 секунд, но если сервер перегружен, то необходимо увеличить интервал запросов до 10, 20, 40 секунд… Вот псевдокод:
let delay = 5000;
let timerId = setTimeout(function request() {
...отправить запрос...
if (ошибка запроса из-за перегрузки сервера) {
// увеличить интервал для следующего запроса
delay *= 2;
}
timerId = setTimeout(request, delay);
}, delay);
Вложенный setTimeout позволяет задать задержку между выполнениями более точно, чем setInterval.
setTimeout с нулевой задержкой
Особый вариант использования: setTimeout(func, 0) или просто setTimeout(func).
Это планирует вызов func настолько быстро, насколько это возможно. Но планировщик будет вызывать функцию только после завершения выполнения текущего кода.
Так вызов функции будет запланирован сразу после выполнения текущего кода.
🚀 Источник: https://learn.javascript.ru/settimeout-setinterval