В TanStack Query отмена запроса рассматривается как часть жизненного цикла асинхронной операции, тесно связанная с управлением состоянием запроса, кэшем и конкурентным выполнением. Отмена позволяет прервать уже запущенный запрос до его завершения, освобождая сетевые ресурсы и предотвращая обновление состояния устаревшими данными.
Ключевая особенность архитектуры заключается в том, что библиотека не
«прерывает» запрос напрямую, а передаёт механизмы отмены в функцию
queryFn, предоставляя разработчику контроль над тем, как
именно реализуется прерывание.
Основной механизм отмены в современных версиях TanStack Query
строится на стандарте AbortController.
Запрос получает объект signal, который позволяет:
fetch-операцииconst fetchUser = async ({ signal }) => {
const res = await fetch('/api/user', { signal })
return res.json()
}
В данном случае signal передаётся автоматически, если
queryFn написан в соответствии с контрактом TanStack
Query.
TanStack Query передаёт signal в объекте контекста,
который приходит в queryFn.
import { useQuery } from '@tanstack/react-query'
const fetchUser = async ({ signal }) => {
const res = await fetch('/api/user', { signal })
return res.json()
}
function User() {
const query = useQuery({
queryKey: ['user'],
queryFn: fetchUser
})
return query.data?.name
}
Если запрос был отменён:
fetch автоматически прерываетсяAbortErrorcancelledОтмена запросов в TanStack Query происходит не только вручную, но и автоматически в ряде случаев.
При изменении ключа запроса предыдущий запрос может быть отменён, если он ещё выполняется.
useQuery({
queryKey: ['user', userId],
queryFn: fetchUser
})
При изменении userId:
Если несколько компонентов одновременно запрашивают одни и те же данные, TanStack Query использует один запрос. При исчезновении всех подписчиков возможна отмена активного запроса.
При размонтировании компонента:
TanStack Query предоставляет возможность вручную отменить запрос
через QueryClient.
import { QueryClient } from '@tanstack/react-query'
const queryClient = new QueryClient()
queryClient.cancelQueries({ queryKey: ['user'] })
При вызове:
Важный архитектурный момент: отмена запроса не всегда означает физическое прекращение выполнения.
Если queryFn не использует signal, возможны
два сценария:
TanStack Query помечает запрос как отменённый, но:
Если используется AbortController:
При использовании axios требуется явная интеграция
AbortSignal.
import axios from 'axios'
const fetchUser = async ({ signal }) => {
const res = await axios.get('/api/user', { signal })
return res.data
}
В современных версиях axios поддержка AbortSignal
встроена, что делает интеграцию с TanStack Query прямолинейной.
Отмена применяется не только к query, но и к
mutation.
import { useMutation } from '@tanstack/react-query'
const mutation = useMutation({
mutationFn: async ({ signal, data }) => {
const res = await fetch('/api/update', {
method: 'POST',
body: JSON.stringify(data),
signal
})
return res.json()
}
})
Отмена тесно связана с предотвращением гонок запросов.
При частом изменении параметров (например, ввод в поиске):
useQuery({
queryKey: ['search', query],
queryFn: fetchSearch
})
поведение следующее:
Это предотвращает ситуацию, когда медленный ответ перезаписывает новый.
При refetch текущий активный запрос может быть отменён
перед запуском нового.
const { refetch } = useQuery({
queryKey: ['user'],
queryFn: fetchUser
})
При вызове:
refetch()
происходит:
Параметры кэша влияют на частоту отмены и перезапуска запросов.
Если данные не устарели:
При удалении данных из кэша:
При отмене запросов возникает AbortError, который
TanStack Query трактует особым образом.
if (error.name === 'AbortError') {
// запрос отменён
}
Особенности:
Механизм повторных попыток игнорирует отменённые запросы.
При retry:
Эффективное использование отмены позволяет снизить нагрузку на сеть и сервер:
Запрос продолжает выполняться даже после отмены, если
signal не используется.
Использование устаревших cancel token вместо
AbortSignal.
Вызовы setState или обработка данных после отмены
запроса.
AbortError не должен обрабатываться как ошибка логики приложения.
Процесс отмены можно разложить на этапы:
Отмена в TanStack Query представляет собой координированный механизм: