0Pricing
React Academy · Урок

Асинхронная логика с createAsyncThunk

Обрабатывайте вызовы API в Redux с помощью createAsyncThunk и жизненного цикла pending/fulfilled/rejected.

«Асинхронная логика с createAsyncThunk» — бесплатный урок React Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Добро пожаловать

В этом уроке Вы научитесь обрабатывать запросы к API в Redux с помощью createAsyncThunk, а также обрабатывать действия жизненного цикла pending (запущено), fulfilled (выполнено) и rejected (завершилось ошибкой) в своём срезе.

Что такое createAsyncThunk

createAsyncThunk создаёт создатель асинхронного действия, который автоматически отправляет три действия жизненного цикла: pending (запущено), fulfilled (выполнено) и rejected (завершилось ошибкой). Обрабатывайте каждое из них в extraReducers.

Определение асинхронного действия

Вызовите createAsyncThunk, передав ему строку типа и асинхронную функцию формирования данных. Верните данные, которые должны попасть в результат fulfilled.
import { createAsyncThunk } from '@reduxjs/toolkit';

export const fetchUser = createAsyncThunk(
  'users/fetchById',
  async (userId) => {
    const response = await fetch('/api/users/' + userId);
    return response.json(); // becomes action.payload on fulfilled
  }
);

Обработка в extraReducers

Добавьте в extraReducers среза ветви для всех трёх состояний жизненного цикла. Управляйте состояниями загрузки, данных и ошибки соответственно.
extraReducers: (builder) => {
  builder
    .addCase(fetchUser.pending, state => {
      state.loading = true;
      state.error = null;
    })
    .addCase(fetchUser.fulfilled, (state, action) => {
      state.loading = false;
      state.user = action.payload;
    })
    .addCase(fetchUser.rejected, (state, action) => {
      state.loading = false;
      state.error = action.error.message;
    });
}

Отправка асинхронного действия

Отправьте асинхронное действие из компонента с помощью useDispatch. Передавайте аргументы непосредственно создателю действия.
const dispatch = useDispatch();
useEffect(() => {
  dispatch(fetchUser(userId));
}, [userId]);

Доступ к состоянию в асинхронном действии

Функция формирования данных получает объект thunkAPI вторым аргументом. Используйте thunkAPI.getState(), чтобы прочитать текущее состояние Redux, а thunkAPI.dispatch() — чтобы отправить другие действия.
export const saveItem = createAsyncThunk(
  'items/save',
  async (item, { getState }) => {
    const { auth } = getState();
    return fetch('/api/items', {
      method: 'POST',
      headers: { Authorization: 'Bearer ' + auth.token },
      body: JSON.stringify(item),
    }).then(r => r.json());
  }
);

Обработка ошибок с помощью rejectWithValue

Чтобы передать пользовательские данные об ошибке в ветвь rejected, используйте thunkAPI.rejectWithValue(). В action.payload отклонённого действия будет содержаться Ваш пользовательский объект ошибки.
export const fetchData = createAsyncThunk(
  'data/fetch',
  async (id, { rejectWithValue }) => {
    const res = await fetch('/api/' + id);
    if (!res.ok) return rejectWithValue({ status: res.status });
    return res.json();
  }
);
// In rejected case: action.payload.status is available

Отмена асинхронных действий

Передайте сигнал AbortController в fetch внутри асинхронного действия. createAsyncThunk автоматически предоставляет сигнал через thunkAPI.signal, когда асинхронное действие отменяется с помощью dispatch.abort().
async (id, { signal }) => {
  const res = await fetch('/api/' + id, { signal });
  return res.json();
}

Ожидание отправленного асинхронного действия

Вызов dispatch() для асинхронного действия возвращает промис. Вы можете дождаться его завершения, чтобы узнать, когда асинхронная работа закончилась; это полезно, например, для перенаправления после сохранения.
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
  navigate('/success');
}

Синтаксис builder и синтаксис объекта

Используйте шаблон обратного вызова builder.addCase в extraReducers — он типобезопасен и поддерживается. Старый синтаксис объекта с ключами устарел в последних версиях RTK.

Быстрая проверка

Что происходит, когда асинхронная функция внутри createAsyncThunk выбрасывает ошибку?

Итоги

createAsyncThunk автоматически создаёт действия pending, fulfilled и rejected. Обрабатывайте все три в extraReducers. Используйте rejectWithValue для пользовательских данных об ошибке, а thunkAPI.getState() — для доступа к текущему состоянию внутри асинхронных действий.

Далее

Следующий урок: **RTK Query: конечные точки и автоматическое кэширование** — Вы определите конечные точки API с помощью createApi и позволите RTK Query автоматически управлять кэшированием.

Часто задаваемые вопросы

Урок «Асинхронная логика с createAsyncThunk» бесплатный?

Да — полный текст урока «Асинхронная логика с createAsyncThunk» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Асинхронная логика с createAsyncThunk»?

Обрабатывайте вызовы API в Redux с помощью createAsyncThunk и жизненного цикла pending/fulfilled/rejected. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Асинхронная логика с createAsyncThunk»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Части Redux Toolkit и createSlice
  2. Асинхронная логика с createAsyncThunk
  3. RTK Query: конечные точки и автоматическое кэширование
  4. Оптимистичные обновления и аннулирование кэша
← Назад к React Academy