Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: React, useEffect, cleanup, async, abort

Как реализовать отменяемый useEffect (cleanup-функция) для асинхронного запроса?

Вопрос проверяет понимание работы эффектов в React и правильной очистки асинхронных операций для предотвращения утечек памяти и ошибок при размонтировании компонента.

Короткий ответ

Для отменяемого useEffect с асинхронным запросом используйте cleanup-функцию, возвращаемую из эффекта. Внутри неё можно отменить запрос через AbortController или установить флаг, чтобы игнорировать результат после размонтирования. Это предотвращает обновление состояния размонтированного компонента и утечки памяти.

Длинный ответ

Проблема асинхронных запросов в useEffect

Когда компонент выполняет асинхронный запрос внутри useEffect, запрос может завершиться уже после того, как компонент будет размонтирован. Если в этот момент попытаться обновить состояние (setState), React выдаст предупреждение о памяти. Чтобы избежать этого, необходимо отменять запрос или игнорировать его результат при очистке эффекта.

Решение с AbortController

Современный способ — использовать AbortController, который позволяет отменить fetch-запрос. Создайте контроллер внутри эффекта, передайте его сигнал в fetch, а в cleanup вызовите abort().

useEffect(() => {
  const controller = new AbortController();
  const signal = controller.signal;

  fetch('/api/data', { signal })
    .then(res => res.json())
    .then(data => setData(data))
    .catch(err => {
      if (err.name !== 'AbortError') console.error(err);
    });

  return () => controller.abort();
}, []);

Решение с флагом

Если вы не используете fetch (например, axios или setTimeout), можно установить флаг, который проверяется перед обновлением состояния.

useEffect(() => {
  let cancelled = false;

  fetchData().then(data => {
    if (!cancelled) setData(data);
  });

  return () => { cancelled = true; };
}, []);

Вывод

Используйте AbortController для fetch-запросов — это стандартный и надёжный способ отмены. Для других асинхронных операций подойдёт флаг. Всегда очищайте эффекты, чтобы избежать утечек памяти и ошибок в React-приложениях.

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию

Уровень

  • Рейтинг:

    5

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • React

    React

Ключевые слова

#React

#useEffect

#cleanup

#async

#abort

Подпишись на React Developer в телеграм

Frontend developer

tech
tech
tech
tech
tech
tech
tech
tech
tech

Ментор по Frontend

Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства

Записаться на консультацию