PassFront
  1. PassFront
  2. База знаний
  3. API и асинхронность

Каких антипаттернов избегать в компоненте с асинхронной логикой?

API и асинхронность

Асинхронная логика в компонентах — главный источник «плавающих» багов. Антипаттерны типовые, и каждый имеет известное лечение.

Гонки запросов (race conditions)

Запросы по смене параметра могут завершаться не по порядку — последний пришедший ответ побеждает, даже если он от устаревшего запроса:

useEffect(() => {
  let stale = false;
  fetchResults(query).then((data) => {
    if (!stale) setResults(data);   // игнорируем устаревший ответ
  });
  return () => { stale = true; };   // или AbortController
}, [query]);

Антипаттерн — fetch в эффекте без отмены/флага.

setState после размонтирования

Ответ пришёл, а компонента нет: лишняя работа и утечки логики (предупреждение об этом React убрал в версии 18). Лечение то же — отмена в cleanup (AbortController) или флаг.

async-функция прямо в useEffect

useEffect(async () => ...) — эффект должен вернуть cleanup, а не Promise. Асинхронность оформляется внутри (IIFE или именованная функция).

Отсутствие обработки состояний

Только «данные»: без loading и error UI молчит при медленной сети и падает при ошибке. Моделировать статус явно (idle/loading/success/error), а не набором рассинхронизирующихся булевых флагов.

Цепочки эффектов

Эффект A ставит state, который триггерит эффект B, тот — C: водопад ререндеров, неотлаживаемая причинность. Объединять логику в один эффект/функцию или выносить в событие.

Дубли запросов

Каждый экземпляр компонента сам грузит те же данные; StrictMode удваивает. Лечение: дедупликация на уровне кеша — TanStack Query/RTK Query (по сути, снимают и гонки, и статусы, и отмену разом).

Забытая зависимость / устаревшее замыкание

Колбэк таймера/подписки видит state первого рендера. Функциональные сеттеры, честные deps, ref для «всегда актуального».

Коротко для собеседования

Избегать: fetch без отмены (гонки, setState после unmount), async-эффектов, отсутствия loading/error-состояний, цепочек эффектов, дублей запросов и stale closures. Системное решение большинства пунктов — React Query + AbortController + явное моделирование статуса.

Другие вопросы раздела