Синхронизация при восстановлении сетевого соединения в TanStack Query представляет собой один из ключевых механизмов обеспечения согласованности данных в приложениях, работающих с нестабильной сетью или офлайн-режимом. Поведение библиотеки в момент перехода из состояния offline в online строится вокруг автоматического переисполнения отложенных запросов, инвалидированных кэшей и стратегий повторной валидации, что позволяет восстановить актуальность данных без ручного вмешательства.
TanStack Query опирается на внутренний механизм отслеживания
состояния сети через события браузера online и
offline. При изменении статуса активируется процесс
синхронизации, в рамках которого происходит переработка очередей
запросов и пересчёт состояния кэша.
Основной источник сигнала:
window.addEventListener('online', handler)window.addEventListener('offline', handler)При переходе в online-режим библиотека инициирует повторную проверку всех активных query, которые были помечены как устаревшие или неуспешные в период отсутствия соединения.
Ключевое свойство этого механизма заключается в том, что он не требует ручного вызова refetch для большинства стандартных сценариев. Синхронизация происходит автоматически, но подчиняется внутренним правилам staleTime, cacheTime и настройкам retry.
Когда запрос выполняется при отсутствии сети, TanStack Query переводит его в состояние error или paused, в зависимости от конфигурации и используемого fetcher’а.
Типичные сценарии:
networkMode: 'offlineFirst';После восстановления соединения такие запросы попадают в очередь на повторное выполнение. При этом библиотека сохраняет оригинальные параметры запроса, включая queryKey, что гарантирует идентичность результата при повторном выполнении.
Внутренний механизм синхронизации формирует очередь задач, которые необходимо выполнить после восстановления сети. Эта очередь включает:
Повторное выполнение происходит с учётом политики retry. Если запрос ранее достиг максимального числа попыток, он не будет автоматически перезапущен без дополнительного взаимодействия.
Состояние stale играет центральную роль в синхронизации. После возвращения сети TanStack Query оценивает каждый query:
Таким образом, восстановление соединения не означает автоматическую перезагрузку всех данных, а лишь тех, которые соответствуют условиям устаревания или явно требуют обновления.
Поведение синхронизации можно управлять через параметр
refetchOnReconnect, который может принимать значения:
true — запросы автоматически обновляются при
восстановлении сети;false — синхронизация при reconnect отключена;'always' — принудительное обновление независимо от
staleTime.Этот параметр может быть задан как глобально через QueryClient, так и локально для конкретного запроса.
Глобальная конфигурация:
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnReconnect: true,
},
},
});
Локальная конфигурация:
useQuery({
queryKey: ['profile'],
queryFn: fetchProfile,
refetchOnReconnect: false,
});
Mutations в TanStack Query имеют отдельный механизм обработки offline-сценариев. При отсутствии сети mutation может быть:
После появления сети происходит последовательное выполнение накопленных mutation. Порядок выполнения соответствует порядку добавления, что важно для сохранения консистентности состояния.
При этом каждый mutation повторно вызывает mutationFn,
используя сохранённые variables. Если mutation не идемпотентен, это
может привести к повторным побочным эффектам, что требует отдельной
архитектурной обработки на уровне API.
Инвалидация кэша (invalidateQueries) тесно связана с
восстановлением сети. Если query был инвалидирован в офлайн-режиме, то
после reconnection он автоматически попадает в список на refetch.
Механизм работает следующим образом:
Это позволяет гарантировать, что любые изменения состояния, произошедшие в офлайн-режиме, будут корректно синхронизированы с сервером.
События восстановления сети часто пересекаются с фокусировкой окна. TanStack Query обрабатывает эти события независимо, но их комбинация может приводить к двойным refetch-запросам.
Приоритет логики:
При резком восстановлении сети (например, после переключения Wi-Fi) может возникнуть ситуация массового запуска refetch. TanStack Query применяет механизм дедупликации:
Это снижает нагрузку на сервер и предотвращает лавинообразный рост сетевых запросов.
В некоторых конфигурациях, особенно при использовании
networkMode: 'offlineFirst', запросы могут находиться в
состоянии paused. Это означает, что fetchFn не выполняется до появления
сети.
После восстановления соединения такие запросы автоматически переходят в состояние active и запускаются без дополнительного триггера. При этом сохраняется контекст выполнения, включая параметры запроса и состояние предыдущих попыток.
При использовании persist-плагинов (например, persistence middleware) процесс синхронизации усложняется, так как данные восстанавливаются из storage перед сетевой синхронизацией.
Последовательность:
Такой подход позволяет обеспечить почти мгновенное восстановление UI с последующей актуализацией данных.
При восстановлении сети возможны конфликты между локальными изменениями и серверным состоянием. TanStack Query не решает конфликт автоматически, но предоставляет инструменты:
onMutate;onError;setQueryData.Типичная проблема возникает, когда mutation выполняется после восстановления сети, но до завершения refetch queries. В таких случаях порядок выполнения mutation и query refetch становится критическим фактором.
При частых переключениях online/offline система синхронизации может входить в цикл повторных попыток. Для стабилизации поведения используются:
Такой подход предотвращает перегрузку сети и избыточные обновления кэша.
QueryClient выступает центральным координатором процесса восстановления соединения. Он агрегирует события сети и управляет глобальными стратегиями:
Через QueryClient можно реализовать кастомные стратегии синхронизации, например:
Механизм восстановления соединения в TanStack Query представляет собой многоуровневую систему, объединяющую события сети, состояние кэша, очереди mutation и стратегию повторных запросов. Он обеспечивает автоматическое восстановление актуальности данных при минимальном участии разработчика, сохраняя при этом гибкость управления через конфигурационные параметры и ручные методы контроля.