Redux-saga

前言

在阅读此文章前,需要你会ES6的Generator函数,另外redux中间件的原理也希望你能初步了解。

为什么会有redux-saga

中间件用过redux-thunk,也用过redux-promise-middleware,原理都很简单。

thunk就是简单的action作为函数,在action进行异步操作,发出新的action。
而promise只是在action中的payload作为一个promise,中间件内部进行处理之后,发出新的action。

这两个简单也容易理解,但是当业务逻辑多且复杂的时候会发生什么情况呢?我们的action越来越复杂,payload越来越长,当然我们可以分离开来单独建立文件去处理逻辑,但是实质上还是对redux的action和reducer进行了污染,让它们变得不纯粹了,action就应该作为一个信号,而不是处理逻辑,reducer里面处理要好一些,但是同样会生出几个多余的action类型进行处理,而且也只能是promise,不能做复杂的业务处理。

redux-saga将进行异步处理的逻辑剥离出来,单独执行,利用generator实现异步处理。
一个计数器示例

redux-saga

  1. saga任务,新建文件处理业务逻辑,使用generator,redux-saga提供很多函数方便处理,put发出action,takeEvery监听action,takeLatest只执行最后一次action,call执行函数,并且可以获取promise的数据
import {delay} from 'redux-saga'
import {put, takeEvery, all, call} from 'redux-saga/effects'

export function* hello() {
  console.log('hello saga!')
}
const ajax = () => new Promise(resolve=>setTimeout(()=>resolve(99), 4000))
export function* incrementAsync() {
  let data = yield call(ajax)
  yield put({type: 'INCREMENT'})
}

export function* watchIncrementAsync() {
  yield takeEvery('INCREMENT', ()=>console.log('+1'))
  yield takeEvery('INCREMENT_ASYNC', incrementAsync)
}

export default function* rootSaga() {
  yield all([
    hello(),
    watchIncrementAsync()
  ])
}
  1. 启动generator
const sagaMiddleware = createSagaMiddleware()
const store = createStore(
  reducer,
  applyMiddleware(sagaMiddleware)
)
sagaMiddleware.run(rootSaga)

后话

antd的dva是对redux-saga的一个很好的实现。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. redux-thunk处理副作用的缺点 1.1 redux的副作用处理 redux中的数据流大致是: UI—...
    Grace_ji阅读 3,581评论 0 14
  • 原文地址在我的博客, 转载请注明出处,谢谢! 概述 本文介绍了我对 Redux 状态管理的思想、原理、架构方法的认...
    莫凡_Tcg阅读 6,894评论 0 15
  • 让我惊讶的是,redux-saga 的作者竟然是一名金融出身的在一家房地产公司工作的员工(让我想到了阮老师。。。)...
    一个笑点低的妹纸阅读 58,168评论 13 87
  • 本文用以记录从调研Redux Saga,到应用到项目中的一些收获。 什么是Redux Saga 官网解释 来自:h...
    FrancisW阅读 17,055评论 14 34
  • Redux-saga 概述 redux-saga是一个用于管理redux应用异步操作的中间件,redux-saga...
    woow_wu7阅读 51,787评论 11 41