一、Redux-Saga 是什么?
Redux-Saga 是一个 Redux 的中间件,用于管理副作用(side effects)。所谓副作用,指的是那些异步的、与外部系统交互的操作,例如:
- 数据的异步请求(AJAX)
- 与本地缓存交互
- 定时器
- 路由跳转等
Redux-Saga 最大的特点是使用 Generator 函数(生成器) 来编写异步逻辑,提供一种同步代码的写法来处理异步流程。
二、Redux-Saga 的核心优势
- 可测试性强
- 逻辑清晰
- 强大的控制流能力
- 非侵入性
三、Redux-Saga 的基本术语和 API
API | 说明 |
---|---|
take(actionType) | 监听某个 action 的触发(阻塞) |
takeEvery(actionType, saga) | 每次触发指定 action 时都执行指定 saga(非阻塞) |
takeLatest(actionType, saga) | 如果某个 action 快速连续触发,只执行最后一次 |
call(fn, ...args) | 调用函数并等待返回结果(阻塞) |
put(action) | 派发一个 action(相当于 dispatch) |
fork(saga) | 启动一个非阻塞任务 |
cancel(task) | 取消某个任务 |
race({...effects}) | 竞争执行多个任务,先完成的胜出,其余取消 |
delay(ms) | 延迟一段时间(模拟定时器) |
四、安装和配置 Redux-Saga
yarn add redux-saga
import createSagaMiddleware from 'redux-saga';
import { configureStore } from '@reduxjs/toolkit';
import rootSaga from './sagas';
const sagaMiddleware = createSagaMiddleware();
const store = configureStore({
reducer: rootReducer,
middleware: (getDefaultMiddleware) =>
getDefaultMiddleware({ thunk: false }).concat(sagaMiddleware),
});
sagaMiddleware.run(rootSaga);
五、Redux-Saga 实战代码示例
包括定义 action、创建 saga、根 saga、UI 调用等,详见正文…
六、Saga 的应用场景
- 网络请求
- 任务重试机制
- 动画执行顺序控制、节流控制(throttle)
- WebSocket 长连接管理
七、Redux-Saga 与 redux-thunk 对比
比较项 | redux-thunk | redux-saga |
---|---|---|
写法 | 使用 async/await | 使用 Generator |
可测试性 | 一般 | 非常好 |
控制复杂异步流程 | 较差,需手动封装 | 强大,天然支持 |
学习曲线 | 低 | 高 |
社区活跃度 | 高 | 高 |
八、总结
Redux-Saga 非常适合处理复杂异步任务和副作用,建议在中大型项目中使用。