0Pricing
React Academy · Lekcja

Logika asynchroniczna z createAsyncThunk

Obsługa wywołań API w Redux za pomocą createAsyncThunk oraz cyklu życia pending/fulfilled/rejected.

Logika asynchroniczna z createAsyncThunk to bezpłatna lekcja React Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Wprowadzenie

W tej lekcji nauczysz się obsługiwać wywołania API w Redux za pomocą createAsyncThunk oraz obsługiwać w swoim slice akcje cyklu życia: pending, fulfilled i rejected.

Czym jest createAsyncThunk?

createAsyncThunk generuje kreator akcji thunk, który automatycznie wysyła trzy akcje cyklu życia: pending (rozpoczęto), fulfilled (zakończono pomyślnie) i rejected (niepowodzenie). Każdą z nich obsługujesz w extraReducers.

Definiowanie thunk

Wywołaj createAsyncThunk, przekazując ciąg znaków typu oraz asynchroniczną funkcję tworzącą payload. Zwróć dane, które mają stać się payloadem akcji 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
  }
);

Obsługa w extraReducers

Dodaj przypadki dla wszystkich trzech stanów cyklu życia w polu extraReducers slice’a. Odpowiednio zarządzaj stanami loading, data i error.
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;
    });
}

Wysyłanie thunk

Wyślij thunk z komponentu za pomocą useDispatch. Przekazuj argumenty bezpośrednio do kreatora akcji thunk.
const dispatch = useDispatch();
useEffect(() => {
  dispatch(fetchUser(userId));
}, [userId]);

Dostęp do stanu w thunk

Funkcja tworząca payload otrzymuje obiekt thunkAPI jako drugi argument. Użyj thunkAPI.getState(), aby odczytać bieżący stan Redux, oraz thunkAPI.dispatch(), aby wysłać inne akcje.
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());
  }
);

Obsługa błędów za pomocą rejectWithValue

Aby przekazać niestandardowy payload błędu do przypadku rejected, użyj thunkAPI.rejectWithValue(). Właściwość action.payload odrzuconej akcji będzie zawierać niestandardowy obiekt błędu.
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

Anulowanie thunków

Przekaż sygnał AbortController do funkcji fetch wywoływanej wewnątrz thunk. createAsyncThunk automatycznie udostępnia sygnał przez thunkAPI.signal, gdy thunk zostanie anulowany za pomocą dispatch.abort().
async (id, { signal }) => {
  const res = await fetch('/api/' + id, { signal });
  return res.json();
}

Oczekiwanie na wysłany thunk

dispatch() wywołane dla thunk zwraca Promise. Można użyć await, aby dowiedzieć się, kiedy operacja asynchroniczna zostanie zakończona. Jest to przydatne na przykład przy przekierowaniu po zapisaniu danych.
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
  navigate('/success');
}

Notacja buildera a notacja obiektowa

W extraReducers używaj wzorca callbacku builder.addCase — zapewnia bezpieczeństwo typów i jest obsługiwany. Starsza notacja z kluczami obiektu jest przestarzała w nowszych wersjach RTK.

Szybkie sprawdzenie

Co się dzieje, gdy funkcja asynchroniczna wewnątrz createAsyncThunk zgłosi błąd?

Podsumowanie

createAsyncThunk automatycznie generuje akcje pending, fulfilled i rejected. Obsługuj wszystkie trzy w extraReducers. Używaj rejectWithValue do niestandardowych payloadów błędów oraz thunkAPI.getState(), aby uzyskać dostęp do bieżącego stanu wewnątrz thunków.

Następna lekcja

Następna lekcja: **RTK Query: endpointy i automatyczne buforowanie** — nauczysz się definiować endpointy API za pomocą createApi i pozwalać RTK Query automatycznie zarządzać cache’em.

Często zadawane pytania

Czy lekcja „Logika asynchroniczna z createAsyncThunk” jest bezpłatna?

Tak — pełny tekst „Logika asynchroniczna z createAsyncThunk” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Logika asynchroniczna z createAsyncThunk”?

Obsługa wywołań API w Redux za pomocą createAsyncThunk oraz cyklu życia pending/fulfilled/rejected. Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Logika asynchroniczna z createAsyncThunk”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Slice'y Redux Toolkit i createSlice
  2. Logika asynchroniczna z createAsyncThunk
  3. RTK Query: endpointy i automatyczne buforowanie
  4. Optymistyczne aktualizacje i unieważnianie cache
← Powrót do React Academy