Почему useEffect не должен принимать async-функцию напрямую?

Эффект должен вернуть cleanup-функцию или ничего, а async callback возвращает Promise. Объявите асинхронную функцию внутри эффекта и игнорируйте её результат после cleanup.

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

Что ответить на собеседовании

Эффект должен вернуть cleanup-функцию или ничего, а async callback возвращает Promise. Объявите асинхронную функцию внутри эффекта и игнорируйте её результат после cleanup.

Подробный разбор

Ответ с пояснениями

Условие

В React написано useEffect(async () => { const roles = await loadRolesData(userId); setRoles(roles); }, [userId]). Пользователь может смениться до ответа. Как исправить контракт эффекта и гонку результатов?

Ответ

Эффект должен вернуть cleanup-функцию или ничего, а async callback возвращает Promise. Объявите асинхронную функцию внутри эффекта и игнорируйте её результат после cleanup.

useEffect(() => {
  let active = true;
  async function load() {
    try {
      const data = await loadRolesData(userId);
      if (active) setRoles(data);
    } catch {
      if (active) setError('Не удалось загрузить роли');
    }
  }
  setRoles([]); setError(null);
  load();
  return () => { active = false; };
}, [userId]);

Если загрузчик поддерживает отмену, добавьте её для экономии ресурсов. Сам список ролей в UI не заменяет серверную проверку прав.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее