redux-saga 中的api 介绍
import { delay } from 'redux-saga';
import { all, call ,put, takeEvery ,fork,takeLatest ,apply,select,take ,cancel} from "redux-saga/effects";
delay 等待时间 接受一个毫秒值为参数 用例:
delay(1000);
all 同时启动多个saga 用例:
yield all([login(),watchIncrementAsync()])
call apply 执行调用接口等异步操作 传参方式不一样 类比原生js中的call apply 用例:
let token = yield call(service.home.login,username,password);let token = yield apply(service.home,service.home.login,[username,password]);
put 类比redux中的dispatch 用例:
yield put({type:types.LOGIN_SUCCESS,token});
takeEvery takeEvery 的作用是每次put 动作执行的的时候 都去调用worker 允许多个任务
实例同时启动,用例:
yield takeEvery(types.LOGIN_REQUEST,function*({type,username,password}:Login){try{const state = yield select(); let token = yield call(service.home.login,username,password);yield put({type:types.LOGIN_SUCCESS,token});yield put(push('/logout'));return token;}catch(error){put({type:types.LOGIN_ERROR,error});} });
takeLatest
只允许一个任务在执行。并且这个任务是最后被启动的那个。用例:
yield takeLatest(types.LOGIN_REQUEST,function*({type,username,password}:Login){try{const state = yield select(); let token = yield call(service.home.login,username,password);yield put({type:types.LOGIN_SUCCESS,token});yield put(push('/logout'));return token;}catch(error){put({type:types.LOGIN_ERROR,error});} });
fork 的作用是启动一个新的task,不阻塞原task执行 用例:
yield fork(login,username,password);
cancel 的作用是取消 fork 任务 用例:
if(action.type === 'LOGOUT')yield cancel(task)
select 相当于redux中的getstate 用例:
const state = yield select()
take 可以看成一个订阅者 监听指定的action用例:
yield take(types.LOGIN_REQUEST);
所有的东西都必须被封装在 sagas 中。sagas 包含3个部分,用于联合执行任务:
worker saga
做所有的工作,如调用 API,进行异步请求,并且获得返回结果
watcher saga
监听被 dispatch 的 actions,当接收到 action 或者知道其被触发时,调用 worker saga 执行任务
root saga
立即启动 sagas 的唯一入口