React Academy · Lezione

Logica asincrona con createAsyncThunk

Gestisca le chiamate API in Redux con createAsyncThunk e il ciclo di vita pending/fulfilled/rejected.

Lezione 2 di 413 passaggi

Logica asincrona con createAsyncThunk è una lezione React Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento React Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso React Academy include 4 lezioni in totale.

Benvenuto

In questa lezione gestirà le chiamate API in Redux con createAsyncThunk e gestirà le action pending, fulfilled e rejected del ciclo di vita nella sua slice.

Che cos'è createAsyncThunk?

createAsyncThunk genera un action creator thunk che invia automaticamente tre action del ciclo di vita: pending (avviata), fulfilled (completata) e rejected (fallita). Gestisca ciascuna di esse in extraReducers.

Definizione di un thunk

Chiami createAsyncThunk con una stringa di tipo e una funzione asincrona che crea il payload. Restituisca i dati che desidera utilizzare come payload dell'action 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
  }
);

Gestione in extraReducers

Aggiunga i casi per tutti e tre gli stati del ciclo di vita in extraReducers della slice. Gestisca di conseguenza lo stato di caricamento, i dati e gli errori.
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;
    });
}

Invio del thunk

Invii il thunk da un componente con useDispatch. Passi gli argomenti direttamente all'action creator del thunk.
const dispatch = useDispatch();
useEffect(() => {
  dispatch(fetchUser(userId));
}, [userId]);

Accesso allo stato nel thunk

La funzione che crea il payload riceve un oggetto thunkAPI come secondo argomento. Utilizzi thunkAPI.getState() per leggere lo stato Redux corrente e thunkAPI.dispatch() per inviare altre action.
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());
  }
);

Gestione degli errori con rejectWithValue

Per passare un payload di errore personalizzato al caso rejected, utilizzi thunkAPI.rejectWithValue(). action.payload dell'action rejected conterrà l'oggetto di errore personalizzato.
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

Annullamento dei thunk

Passi un segnale AbortController alla funzione fetch all'interno del thunk. createAsyncThunk fornisce automaticamente signal tramite thunkAPI.signal quando il thunk viene annullato con dispatch.abort().
async (id, { signal }) => {
  const res = await fetch('/api/' + id, { signal });
  return res.json();
}

Attesa di un thunk inviato

dispatch() di un thunk restituisce una Promise. Può attenderla per sapere quando il lavoro asincrono è completato, una soluzione utile per i pattern di reindirizzamento dopo il salvataggio.
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
  navigate('/success');
}

Notazione builder e notazione a oggetto

Utilizzi il pattern della callback builder.addCase in extraReducers: è type-safe ed è supportato. La precedente notazione con chiavi oggetto è deprecata nelle versioni recenti di RTK.

Verifica rapida

Che cosa succede quando la funzione asincrona all'interno di createAsyncThunk genera un errore?

Riepilogo

createAsyncThunk genera automaticamente le action pending/fulfilled/rejected. Gestisca tutte e tre in extraReducers. Utilizzi rejectWithValue per i payload di errore personalizzati e thunkAPI.getState() per accedere allo stato corrente all'interno dei thunk.

Prossimo argomento

Prossima lezione: **RTK Query: endpoint e caching automatico** — definirà gli endpoint API con createApi e lascerà che RTK Query gestisca automaticamente il caching.
Gratis per iniziare

Impara React con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
88
Lezioni
324

Domande Frequenti

La lezione «Logica asincrona con createAsyncThunk» è gratuita?

Sì — il testo completo di «Logica asincrona con createAsyncThunk» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso React Academy, passa a CoddyKit PRO. Il corso React Academy include 4 lezioni in totale.

Cosa imparerò in «Logica asincrona con createAsyncThunk»?

Gestisca le chiamate API in Redux con createAsyncThunk e il ciclo di vita pending/fulfilled/rejected. Eserciti React Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare React Academy?

Non è richiesta alcuna esperienza precedente. React Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Logica asincrona con createAsyncThunk»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione React Academy?

Sì. Ogni lezione React Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Slice di Redux Toolkit e createSlice
  2. Logica asincrona con createAsyncThunk
  3. RTK Query: endpoint e caching automatico
  4. Aggiornamenti ottimistici e invalidazione della cache
← Torna a React Academy