Самописный хук useFetch

Хук должен возвращать данные, загрузку и ошибку, перезапуская запрос при смене endpoint. Cleanup отменяет предыдущую загрузку и предотвращает устаревшее обновление.

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

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

Хук должен возвращать данные, загрузку и ошибку, перезапуская запрос при смене endpoint. Cleanup отменяет предыдущую загрузку и предотвращает устаревшее обновление.

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

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

Условие

Реализуйте пользовательский хук useFetch, который принимает в качестве параметра адрес ресурса.

function useFetch(endpoint) {}

Ответ

Хук должен возвращать данные, загрузку и ошибку, перезапуская запрос при смене endpoint. Cleanup отменяет предыдущую загрузку и предотвращает устаревшее обновление.

function useFetch(endpoint) {
  const [state, setState] = React.useState({ endpoint: null, data: null, error: null, loading: false });
  React.useEffect(() => {
    const controller = new AbortController();
    setState({ endpoint, data: null, error: null, loading: true });
    (async () => {
      try {
        const response = await fetch(endpoint, { signal: controller.signal });
        if (!response.ok) throw new Error('HTTP ' + response.status);
        const data = await response.json();
        if (!controller.signal.aborted) setState({ endpoint, data, error: null, loading: false });
      } catch (error) {
        if (!controller.signal.aborted) setState({ endpoint, data: null, error, loading: false });
      }
    })();
    return () => controller.abort();
  }, [endpoint]);
  if (state.endpoint !== endpoint) return { data: null, error: null, loading: true };
  return { data: state.data, error: state.error, loading: state.loading };
}

Пример рассчитан на JSON GET и непустой строковый URL. Кеш, retry, авторизация и runtime-проверка DTO — отдельные расширения; сетевые ошибки нельзя трактовать как пустой успешный результат.

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

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

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

Подробнее