Вопрос проверяет, понимаешь ли ты, как планирование задач в JS влияет на сеть и нагрузку при периодических запросах.
setInterval запускает обработчик по расписанию, даже если предыдущий запрос ещё не закончился, из-за чего появляются параллельные запросы и лишняя нагрузка. Интервалы также “плывут” (drift): если обработчик выполняется долго, фактические моменты запуска смещаются. setTimeout удобнее для polling, потому что позволяет запускать следующий запрос после завершения предыдущего и гибко менять задержку (например, при ошибках увеличить).
Polling — это повторяющиеся запросы “проверить состояние”. Для него важно контролировать конкуренцию и частоту.
Определение: Polling — периодическая проверка сервера клиентом (например, “появились ли новые данные?”).
Наложение запросов (overlap)
Если запрос идёт 3 секунды, а interval = 1 секунда, то за 10 секунд накопится пачка запросов.
Непредсказуемая нагрузка
Сервер получает всплески, клиент — рост потребления памяти/сети.
Сложнее делать backoff
При ошибках или 429 нужно увеличивать паузу, а у setInterval это менее удобно (часто приходится clearInterval и ставить заново).
Drift и очередь событий
Если вкладка “тормозит” или поток занят, срабатывания могут сдвигаться и сгущаться.
Следующий тик после завершения
Запускаем таймер только когда закончили текущий запрос.
Гибкая задержка
Можно динамически менять интервал: нормальный режим, backoff при ошибках, пауза при скрытой вкладке.
let stopped = false;
async function poll() {
try {
const res = await fetch("/api/status");
// обработка res...
if (!stopped) setTimeout(poll, 1000);
} catch (e) {
// при ошибке можно увеличить интервал
if (!stopped) setTimeout(poll, 3000);
}
}
poll();
// чтобы остановить:
stopped = true;
setTimeout для polling обычно предпочтительнее, потому что даёт контроль: нет параллельных запросов, проще backoff и понятнее управление частотой.