Async Logic with createAsyncThunk
Handle API calls in Redux with createAsyncThunk and the pending/fulfilled/rejected lifecycle.
Async Logic with createAsyncThunk is a free React Academy lesson on CoddyKit — lesson 2 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the React Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Welcome
What Is createAsyncThunk?
Defining a Thunk
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
}
);Handling in 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;
});
}Dispatching the Thunk
const dispatch = useDispatch();
useEffect(() => {
dispatch(fetchUser(userId));
}, [userId]);Accessing State in the Thunk
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());
}
);Handling Errors with rejectWithValue
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 availableCancelling Thunks
async (id, { signal }) => {
const res = await fetch('/api/' + id, { signal });
return res.json();
}Awaiting a Dispatched Thunk
const result = await dispatch(saveItem(data));
if (saveItem.fulfilled.match(result)) {
navigate('/success');
}Builder Notation vs Object Notation
Quick Check
Recap
Up Next
Frequently asked questions
Is the “Async Logic with createAsyncThunk” lesson free?
Yes — the full text of “Async Logic with createAsyncThunk” is free to read here on the web, and the React Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the React Academy course, upgrade to CoddyKit PRO.
What will I learn in “Async Logic with createAsyncThunk”?
Handle API calls in Redux with createAsyncThunk and the pending/fulfilled/rejected lifecycle. You practise React Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start React Academy?
No prior experience is required. React Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 2 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Async Logic with createAsyncThunk” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this React Academy lesson?
Yes. Every React Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Redux Toolkit Slices & createSlice
- Async Logic with createAsyncThunk
- RTK Query: Endpoints & Auto-Caching
- Optimistic Updates & Cache Invalidation