createAsyncThunk tạo thunk action creator cho async logic (gọi API) và tự dispatch ba lifecycle action: pending (bắt đầu → bật loading), fulfilled (thành công → cập nhật data), rejected (thất bại → hiện lỗi).
ts
const fetchUser = createAsyncThunk(
'users/fetch',
async (userId, { rejectWithValue }) => {
try {
return await api.getUser(userId)
} catch (err) {
return rejectWithValue(err.response.data)
}
},
)Xử lý trong slice bằng extraReducers với builder pattern:
ts
extraReducers: (builder) => {
builder
.addCase(fetchUser.pending, (state) => { state.loading = true })
.addCase(fetchUser.fulfilled, (state, action) => {
state.loading = false
state.data = action.payload
})
.addCase(fetchUser.rejected, (state, action) => {
state.loading = false
state.error = action.payload
})
}- Option
conditionhuỷ thunk khi data đã có trong cache, tránh gọi API trùng. - Với RTK Query, phần lớn use case của
createAsyncThunkđược thay thế hoàn toàn mà không cần viết reducer.
Lưu ý: luôn dùng rejectWithValue thay vì throw trực tiếp — error object không serializable sẽ khiến DevTools hiển thị sai.