createAsyncThunk
是 Redux Toolkit 中的一个核心 API,专门用于简化 Redux 中异步操作(如 API 请求、定时任务等)的管理。它自动生成 pending/fulfilled/rejected 三种 action 类型,并处理异步流程的生命周期,减少开发者手动编写样板代码的工作量。
type
字符串,自动生成三种 action 类型(如 type/pending
, type/fulfilled
, type/rejected
)。try/catch
或 Promise 的 reject
自动捕获错误,并触发 rejected
action。import { createAsyncThunk } from '@reduxjs/toolkit';
const asyncThunk = createAsyncThunk(
type: string, // 基础 action 类型(如 'users/fetch')
payloadCreator: (arg, thunkAPI) => Promise, // 异步逻辑
options?: { ... } // 可选配置
);
type
createAsyncThunk(
(page) => `users/fetchPage/${page}`,
async (page) => { /* ... */ }
);
payloadCreator
核心函数:包含异步逻辑(如 API 请求),必须返回一个 Promise。
参数:
arg
:调用 thunk 时传入的参数(如 dispatch(fetchUser(123))
中的 123
)。thunkAPI
:包含 Redux 相关方法和工具:
dispatch
:Redux 的 dispatch
方法。getState
:获取当前 Redux 状态。rejectWithValue
:将自定义错误传递给 rejected
action。signal
:AbortController 的信号,用于取消请求。示例:
const fetchUser = createAsyncThunk(
'user/fetch',
async (userId, { rejectWithValue }) => {
try {
const response = await api.getUser(userId);
return response.data; // 传递给 fulfilled action 的 payload
} catch (err) {
return rejectWithValue(err.response.data); // 传递给 rejected action 的 payload
}
}
);
options
(可选)condition
: 控制是否执行异步逻辑(如避免重复请求)。dispatchConditionRejection
: 当 condition
返回 false
时,是否触发 rejected
action。serializeError
: 自定义错误序列化逻辑。dispatch
时触发异步操作。fulfilled
action 的 payload。rejected
action 的 error。在 Redux slice 的 extraReducers
中监听生成的三种 action:
const userSlice = createSlice({
name: 'user',
initialState: { data: null, loading: false, error: null },
reducers: {},
extraReducers: (builder) => {
builder
.addCase(fetchUser.pending, (state) => {
state.loading = true;
state.error = null;
})
.addCase(fetchUser.fulfilled, (state, action) => {
state.loading = false;
state.data = action.payload;
})
.addCase(fetchUser.rejected, (state, action) => {
state.loading = false;
state.error = action.error.message; // 或 action.payload(如果用了 rejectWithValue)
});
},
});
使用 rejectWithValue
传递错误信息:
const fetchUser = createAsyncThunk(
'user/fetch',
async (userId, { rejectWithValue }) => {
try {
const response = await api.getUser(userId);
return response.data;
} catch (err) {
// 返回自定义错误对象(而非默认的 Error 实例)
return rejectWithValue({
message: 'Failed to fetch user',
code: err.response.status,
});
}
}
);
在 reducer 中通过 action.payload
获取错误信息:
.addCase(fetchUser.rejected, (state, action) => {
state.error = action.payload; // { message: 'Failed...', code: 404 }
});
AbortController
)。payloadCreator
中只处理逻辑,状态更新在 extraReducers
中进行。rejectWithValue
。signal
实现请求取消:const fetchUser = createAsyncThunk('user/fetch', async (_, { signal }) => {
const response = await fetch('/api/user', { signal });
return response.json();
});
// 调用 abortController.abort() 取消请求
createAsyncThunk
是 Redux Toolkit 中处理异步操作的标准化方案,通过自动生成 action 类型和生命周期管理,显著减少冗余代码。结合 createSlice
的 extraReducers
,可以高效实现异步状态管理,尤其适合与 RTK Query 之外的 REST API 交互场景。