前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React:Redux怎么处理异步?

React:Redux怎么处理异步?

作者头像
WEBJ2EE
发布2019-07-19 11:44:56
2.6K0
发布2019-07-19 11:44:56
举报
文章被收录于专栏:WebJ2EEWebJ2EE

Redux是个状态管理容器,核心接口就这几个:

createStore(reducer, preloadedState, enhancer); store.subscribe(listener); // 订阅State的变化; store.dispatch(action); // 分发Action store.getState(); // 获取State;

我们只能通过dispatch(action)来触发状态变化:

store.dispatch(action); // 分发Action

dispatch(action)则通过reducer完成状态修改:

currentState = currentReducer(currentState, action)

附:redux的dispatch源码

至此,我们可以看出

Reducer 必须是同步函数

不能放置异步逻辑

(注:Redux要求Reducer必须是“纯函数”!)


那么,问题来了...

Redux应该在哪处理异步逻辑?

异步逻辑应放置在

Redux中间件中处理

!! Middleware !!

(就是下面要提到的redux-thunk、redux-promise)

Redux中间件实质是

store.dispatch函数的增强器

它们拦截特定的Action

并在其中把带有副作用的工作完成

(例如:异步...)

1. 有哪些异步处理中间件?

redux-thunk:不到10行代码,精简到炸! redux-promise:基于Promise的异步处理; redux-promise-middleware:还是Promise; redux-saga:最优雅!最复杂!

下面,通过代码示例

直观展示这4款中间件的差异

2. redux-thunk

redux:

store.dispatch({type: "INC", payload:....}); 注:redux 的 action 是一个简单 JS 对象;

redux-thunk:

store.dispatch((dispatch, getState) => { ... }) 注:redux-thunk 允许我们 dispatch 一个 thunk函数;

redux-thunk 中间件允许你 dispatch 一个函数(即:thunk),异步逻辑就放在这个函数中处理;

感受一波redux-thunk的精炼

redux-thunk应用示例

总结:

redux-thunk 允许我们 dispatch 一个包含异步处理逻辑函数(thunk);优点是我们可以借助这种简单的机制在 redux 中处理异步逻辑;缺点是这会让 action 变的不纯粹,也会使得业务逻辑很分散;

扫码查看示例源码

2. redux-promise

redux:

store.dispatch({type: "INC", payload:....});

redux-thunk:

store.dispatch((dispatch, getState) => { ... }) 注:redux-thunk 允许我们 dispatch 一个 thunk函数;

redux-promise:

store.dispatch({type:"INC", payload: Promise}); 注:redux-promise 允许我们 dispatch 一个 payload 为 Promise 的 action;

redux-promise也很精炼

redux-promise应用示例

总结:

redux-promise 虽然比 redux-thunk 封装的更深,但仍然存在几个问题:

a. INC_INPROGRESS 动作不太好安置,不利于我们实现 loading 状态;

b. 业务逻辑实质还是集中在 action 中处理,变更了 action 原本的含义;

扫码查看示例源码

2. redux-promise-middleware

redux:

store.dispatch({type: "INC", payload:....});

redux-thunk:

store.dispatch((dispatch, getState) => { ... }) 注:redux-thunk 允许我们 dispatch 一个 thunk函数;

redux-promise:

store.dispatch({type:"INC", payload: Promise}); 注:redux-promise 允许我们 dispatch 一个 payload 为 Promise 的 action;

redux-promise-middleware:

store.dispatch({type:"INC", payload: Promise}); 注:redux-promise-middleware 与 redux-promise 一样,允许我们 dispatch 一个 payload 为 Promise 的 action;

redux-promise-middleware应用示例

总结:

redux-promise-middleware 与 redux-promise 差不多...不多说了...

扫码查看示例源码

2. redux-saga

redux:

store.dispatch({type: "INC", payload:....});

redux-thunk:

store.dispatch((dispatch, getState) => { ... }) 注:redux-thunk 允许我们 dispatch 一个 thunk函数;

redux-promise:

store.dispatch({type:"INC", payload: Promise}); 注:redux-promise 允许我们 dispatch 一个 payload 为 Promise 的 action;

redux-saga:

store.dispatch({type:"INC", payload:...}); 注:redux-saga 不会变动 action 的本来含义,action 仍然是一个普通的 JS 对象;

redux-saga应用示例

总结:

redux-saga是最优雅的,也是最复杂的异步中间件:

a. 有强大的异步流程控制功能(例:takeEvery、takeLatest);

b. 异步业务逻辑被集中在 Saga 中管理;

c. 没有修改 action 原本的含义;

d. 结合 Generator、Promise 特性,用同步的方式书写异步代码;

扫码查看示例源码

精选文章推荐

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-01 21:54:01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebJ2EE 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 精选文章推荐
相关产品与服务
消息队列 TDMQ
消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档