0Pricing
React Academy · Урок

Шаблон длительного опроса и логика переподключения

Реализуйте длительный опрос с экспоненциальной задержкой и автоматическим переподключением с помощью useEffect и AbortController

«Шаблон длительного опроса и логика переподключения» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Цикл длительного опроса

Длительный опрос работает циклически: клиент отправляет HTTP-запрос, сервер удерживает соединение открытым, пока не появятся новые данные или не истечёт время ожидания (обычно 30–60 секунд), сервер отвечает данными, а клиент сразу отправляет новый запрос. Это создаёт почти непрерывное соединение с характеристиками серверной отправки данных.

Реализация длительного опроса в useEffect

В React длительный опрос реализуется с помощью асинхронной рекурсивной функции внутри useEffect. Функция выполняет запрос, обрабатывает ответ, а затем снова вызывает себя. Сигнал AbortController останавливает рекурсию, когда компонент размонтируется. Функция выполняется, пока компонент смонтирован и не был подан сигнал прерывания.

AbortController для очистки

Создайте AbortController в начале useEffect и передавайте controller.signal в каждый запрос. В функции очистки вызовите controller.abort(). Это отменяет любой выполняющийся запрос при размонтировании компонента, предотвращая обновление состояния размонтированных компонентов и утечки сетевых ресурсов.

Экспоненциальная задержка при ошибке

Если запрос длительного опроса завершается ошибкой, не повторяйте его сразу — подождите перед следующей попыткой. При экспоненциальном увеличении задержки время ожидания после каждой последовательной ошибки удваивается: 1 с, 2 с, 4 с, 8 с, 16 с, но не превышает 30 с. Это предотвращает перегрузку неисправного сервера и даёт временным проблемам время на устранение. После успешного ответа сбрасывайте задержку до 1 с.

Добавление случайного разброса к задержке

Если множество клиентов опрашивает один и тот же сервер, экспоненциальная задержка без случайного разброса приводит к «эффекту стада»: все клиенты делают одинаковую паузу и одновременно повторяют запрос, снова перегружая сервер. Добавьте случайный разброс, рандомизируя задержку: delay + Math.random() * delay. Это распределяет повторные попытки по временному интервалу и уменьшает резкие скачки нагрузки на сервер.

Состояние подключения

Поддерживайте состояние подключения, отражающее жизненный цикл опроса: isConnecting (первоначальное подключение или переподключение после ошибки), isConnected (последний опрос завершился успешно), isError (последовательные ошибки, достигнуто максимальное число повторных попыток). Отображайте это состояние в интерфейсе, чтобы пользователи понимали, насколько надёжны данные в реальном времени.

Отображение таймера до следующего опроса

Во время задержки перед следующей попыткой можно показать обратный отсчёт: «Переподключение через 8 с...» с индикатором выполнения. Вычисляйте время следующей попытки при установке таймера задержки и обновляйте отображение каждую секунду. Такая прозрачность убеждает пользователей, что приложение активно пытается восстановить соединение.

Рекурсивный setTimeout вместо setInterval

Для опроса используйте рекурсивный setTimeout (вызывайте следующий опрос внутри обработчика ответа), а не setInterval. setInterval срабатывает через фиксированные интервалы независимо от продолжительности предыдущего запроса, поэтому длительные запросы могут привести к наложению опросов. Рекурсивный setTimeout запускает следующий опрос только после завершения предыдущего.

Настройка интервала опроса

Предоставьте интервал опроса как параметр конфигурации вашего хука: useLongPoll({ url, interval: 5000 }). Для разных источников данных нужна разная частота обновления: индикатор пользователей, находящихся в сети, можно обновлять каждые 30 с, а состояние задачи — каждые 5 с. Не задавайте интервалы жёстко в коде реализации.

Переход от опроса к SSE

По мере развития API можно заменить опрос на SSE для повышения эффективности. Компонент React, использующий хук опроса, не должен зависеть от транспортного уровня. Если хук предоставляет тот же интерфейс (onData, состояние, ошибка), переход с опроса на EventSource внутри хука не потребует изменений в компоненте, который его использует.

Обработка времени ожидания на сервере

Если сервер удерживает соединение длительного опроса, но данные не поступают, он должен ответить по истечении времени ожидания (200 с пустым телом или 204 No Content), чтобы соединение не зависало навсегда. Затем клиент сразу выполняет новый опрос. Это серверное время ожидания (30–60 с) отличается от времени ожидания запроса на стороне клиента, которое должно быть больше, например 90 с.

Назначение экспоненциальной задержки

Почему при повторных попытках после ошибок соединения длительный опрос использует экспоненциальное увеличение задержки?

Итоги урока: длительный опрос

Длительный опрос работает так: клиент отправляет запрос, сервер удерживает соединение до появления данных или истечения времени ожидания, а клиент сразу отправляет новый запрос после ответа. Реализуйте его с помощью рекурсивного асинхронного запроса в useEffect и AbortController для очистки. При ошибке используйте экспоненциальную задержку (1 с, 2 с, 4 с и далее, максимум 30 с) вместе со случайным разбросом, чтобы предотвратить эффект стада. Используйте рекурсивный setTimeout вместо setInterval, чтобы избежать наложения опросов. Отслеживайте состояния isConnecting/isConnected/isError для отображения обратной связи в интерфейсе.

Часто задаваемые вопросы

Урок «Шаблон длительного опроса и логика переподключения» бесплатный?

Да — полный текст урока «Шаблон длительного опроса и логика переподключения» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблон длительного опроса и логика переподключения»?

Реализуйте длительный опрос с экспоненциальной задержкой и автоматическим переподключением с помощью useEffect и AbortController Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Шаблон длительного опроса и логика переподключения»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Сравнение SSE, WebSockets и опроса
  2. Использование потоков SSE в React с EventSource
  3. Шаблон длительного опроса и логика переподключения
  4. Создание ленты уведомлений в реальном времени
← Назад к React Academy