redux-saga
redux-saga是管理redux异步操作的中间件,redux-saga通过创建sagas将所有异步操作逻辑 收集在一个地方集中处理,便于后期维护,让异步流程更加易于读取,写入和测试,通过这种方式,让异步看起来更像同步的javaScript(有点像async/await)
redux-saga常见的API
Middleware API
createSagaMiddleware()创建一个 Redux middleware,并将 Saga连接到 Redux Store。
import createSagaMiddleware from 'redux-saga'
var SagaMiddleware=createSagaMiddleware()
const store =createStore(reduce,applyMiddleware(SagaMiddleware))
middleware.run(saga)
动态地运行 saga。只能 用于在 applyMiddleware阶段 之后 执行 Saga。
saga: Function: 必须是一个返回 Generator 对象 的函数
args: 提供给 saga 的参数
import createSagaMiddleware from 'redux-saga'
import {helloSaga} from './sagas/index'
var SagaMiddleware=createSagaMiddleware()
const store =createStore(reduce,applyMiddleware(SagaMiddleware))
export default store
SagaMiddleware.run(helloSaga)
Saga 辅助函数
takeEvery,takeLatest,throttle都会监听action
takeEvery(pattern, saga, ...args)在发起(dispatch)到 Store 并且匹配 pattern 的每一个 action 上派生一个 saga
-
pattern:创建一个 Effect 描述信息,用来命令 middleware 在 Store 上等待指定的 action。 在发起与
pattern匹配的 action 之前,Generator 将暂停。 -
saga: Function- 一个 Generator 函数yield takeEvery("takeEvery", function* () { yield console.log('takeEvery'); });
takeLatest(pattern, saga, ...args)在发起到 Store 并且匹配 pattern 的每一个 action 上派生一个 saga。并自动取消之前所有已经启动但仍在执行中的 saga 任务。
- pattern:创建一个 Effect 描述信息,用来命令 middleware 在 Store 上等待指定的 action。 在发起与
pattern匹配的 action 之前,Generator 将暂停。 saga: Function- 一个 Generator 函数
yield takeLatest("takeLatest", function* () {
yield console.log('takeLatest');
});
throttle(ms, pattern, saga, ...args)在发起到 Store 并且匹配 pattern 的一个 action 上派生一个 saga。 它在派生一次任务之后,仍然将新传入的 action 接收到底层的 buffer 中,至多保留(最近的)一个。但与此同时,它在 ms 毫秒内将暂停派生新的任务 —— 这也就是它被命名为节流阀(throttle)的原因。其用途,是在处理任务时,无视给定的时长内新传入的 action。
ms: Number- 在 action 开始处理后,无视新 action 的时长;以毫秒为单位。- pattern:创建一个 Effect 描述信息,用来命令 middleware 在 Store 上等待指定的 action。 在发起与
pattern匹配的 action 之前,Generator 将暂停。 saga: Function- 一个 Generator 函数-
yield throttle(2000, "throttle", function* () { yield console.log('throttle'); });
Effect 创建器
take(pattern)
take函数可以理解为监听未来的action,它创建了一个命令对象,告诉middleware等待一个特定的action, Generator会暂停,直到一个与pattern 匹配的action被发起,才会继续执行下面的语句,也就是说,take是一个阻塞的 effect
yield take('wwwww')
yield takeEvery("takeEvery", function* () {
yield console.log('takeEvery',state);
});
call(fn, …args)
call函数你可以把它简单的理解为就是可以调用其他函数的函数,它命令 middleware 来调用fn 函数, args为函数的参数,call 函 数也是阻塞 effect
yield takeEvery("takeEvery", function* () {
const res = yield fork(axios.get, `http://localhost:3000/zbf/takeEvery`, {
// params:{...state}
params: { index: i },
});
yield console.log('takeEvery',res);
});
select(selector, …args)
select 函数是用来指示 middleware调用提供的选择器获取Store上的state数据,你也可以简单的把它理解为redux框架中获取store上的 state数据一样的功能 :store.getState()
const state=yield select(state=>{
return state.store.user
})
put(action)
创建一个 Effect 描述信息,用来命令 middleware 向 Store 发起一个 action。 这个 effect 是非阻塞型的,并且所有向下游抛出的错误(例如在 reducer 中),都不会冒泡回到 saga 当中。
let i = 0;
yield takeEvery("takeEvery", function* () {
i++;
const res = yield call(axios.get, `http://localhost:3000/zbf/takeEvery`, {
params: { index: i },
});
yield console.log(res.data.index,'25takeEvery');
yield put({
type:"eeeee",
index:res.data.index
})
});
case "eeeee":
console.log(action.index,12345);
return {
datas:action.index
}
componentDidUpdate(oldProps){
console.log(this.props);
}
Effect 组合器(combinators)
all([effects,effects])
创建一个 Effect 描述信息,用来命令 middleware 并行地运行多个 Effect,并等待它们全部完成。
import {classify} from './classity.js'
import {home} from './home.js'
import {
all
} from "redux-saga/effects";
export function* defsaga(){
yield all([classify(),home()])
}
ctx.request.body
// router.get("/takeEvery", async function (ctx, next) {
// // console.log({...ctx.query},'123');
// ctx.body=ctx.query
// });