欢迎指导与讨论:)

  前言

    本文不涉及深入的知识,只是在概念层面和一个简单的例子解释redux-observable的工作原理。

    redux-observable,是redux的一个中间件库。它能够自动响应我们所dispatch的actions并执行对应的函数,让我们把复杂的异步函数分离到一些Epic的函数里面。因此不再需要react-thunk来让redux支持所谓的异步action了,同时让代码耦合度降得更低。redux-observable让redux的action更加纯净,都是干净的对象字面量 —— redux-observable适合大型复杂的状态管理,而且让代码分离度和可维护度更高。但可能需要先掌握RxJS的基本概念和api用法。

  

  几个概念

    可观察流与自动响应、redux的dispatch、Epics函数、redux-observable的内部原理。

    可观察流与自动响应

      可观察流相当于一个发射器,它能够随时间地流逝不断 发送/产生 各种各样的值,当我们监听这个发射器时,就会收到发射过来的值并可以执行我们想要的操作。而启动这个监听,需要触发 .subscribe( ) 。每当有一个新值发送时,subscribe里的代码就会自动执行 —— 自动响应。

// 一个简单的例子

发射器.subscribe( function( 收到的值 ){
// 根据值可以进行一些函数操作
})

    

    redux的dispatch( action )

      redux的dispatch(action)函数能够根据action类型的不同,让应用的状态store响应它的变化。每当dispatch一个action时,应用状态可能就会更变。

// 下面代码触发时,应用状态会被刷新

dispatch({ type: 'man' })

    

    Epics函数

      redux-observable里的Epics函数主要作用是:1. 传进一个action,然后return一个新的、不一样的action。2. 这个Epics函数是一个发射器,因此我们能够subscribe它,从而可以监听并收到新的action。3. 每当我们调用redux的dispatch的时候,所有的Epics函数都会执行。

function (action$: Observable<Action>, store: Store): Observable<Action>;

    

    redux-observable的内部原理

       ( 1 ) 每当我们使用redux的dispatch的时候,每个Epics函数都会收到我们所dispatch的action,然后Epics函数返回一个新的action。

      (2)监听Epics函数,将它返回的新的action,用来dispatch,从而更新应用状态

// 用代码表示就是

epic(actions$).subscribe( function( ){
dispatch( newAction ) // dispatch新的action
}) 

    

   一个简单的例子

// 定义两个action creator

// 1. 拉取某用户数据
const fetchUser = username => ({ type: '拉取某用户数据', target: username });
// 2. 拉取完成
const fetchUserDone = data => ({ type: '拉取完成', data}); // 定义一个Epics函数
const fetchEpics = action$ =>
action$.ofType('拉取某用户数据') // 如果true则进行下一步否则退出
.mergeMap( action =>
// 提取action.target并进行ajax请求
ajax.getJson(`/api/users/${action.target}`)
.map(function( data ){
fetchUserDone ( data )// 调用拉取完成函数,返回{ type: '拉取完成', data }
})
);

    从上面的这个例子我们看到:

    (1)不再有异步action,即类型为函数的这种action,redux的action都是纯净的对象字面量了。

    (2)拉取数据的函数写到了Epics函数里面

    (3)Epics函数会对action的类型进行判断,满足不了不会继续执行

    (4)注:上面的mergeMap、ajax、map这几个都是RxJS的api。

  总结

    redux-observable的优点大概有这几个,欢迎补充。(1)会自动响应redux的dispatch,每当触发时都会执行我们定义的Epics函数。(2)把拉取数据等等的业务逻辑代码可以分离到Epics函数里面,降低代码耦合度,提升维护度(3)action都是纯净的对象字面量,不再需要引入redux-thunk。

    

redux-observable笔记的更多相关文章

  1. React+Redux学习笔记:React+Redux简易开发步骤

    前言 React+Redux 分为两部分: UI组件:即React组件,也叫用户自定义UI组件,用于渲染DOM 容器组件:即Redux逻辑,处理数据和业务逻辑,支持所有Redux API,参考之前的文 ...

  2. 【原】redux学习笔记

    上周学习了flux,这周研究了一下redux,其实很早之前都已经在研究他们了,只是之前一直没搞懂,最近这两周可能打通了任督二脉,都算入门了. 写博客的目的主要是做一下笔记,总结一下思路,以及和大家交流 ...

  3. redux学习笔记

    中文api:http://cn.redux.js.org/docs/react-redux/troubleshooting.html 3.6 Reducer Store 收到 Action 以后,必须 ...

  4. React Redux学习笔记

    React Router React Router 使用教程 Redux中间件middleware [译]深入浅出Redux中间件 Redux学习之一:何为middleware? ES6 ES6新特性 ...

  5. Redux学习笔记:Redux简易开发步骤

    该文章不介绍Redux基础,也不解释各种乱乱的概念,网上一搜一大堆.只讲使用Redux开发一个功能的步骤,希望可以类我的小白们,拜托它众多概念的毒害,大牛请绕道! 本文实例源代码参考:React-Re ...

  6. Redux 学习笔记

    1:首先安装redux: npm install --save redux 2:引入redux : import { createStore } from 'redux'; //首先创建执行函数,Re ...

  7. Redux学习笔记--异步Action和Middleware

    异步Action 之前介绍的都是同步操作,Redux通过分发action处理state,所有的数据流都是同步的,如果需要一步的话怎么办? 最简单的方式就是使用同步的方式来异步,将原来同步时一个acti ...

  8. Redux学习笔记-基础知识

      Redux概述 是什么:Redux是管理状态的容器,提供可预测的状态管理. 怎么做:Redux主要是用来管理组件或者应用的状态,本质上跟一个事件处理器差不多.通过分发action触发reduce来 ...

  9. Redux学习笔记-----基础部分

    Redux的基本原则 唯一数据源(应用的状态数据应该只存储在唯一的一个store上): 保持状态只读(不能直接修改Store的状态,而是应该通过派发一个action对象来完成) 数据改变只能通过纯函数 ...

  10. 网页前端状态管理库Redux学习笔记(一)

    最近在博客园上看到关于redux的博文,于是去了解了一下. 这个Js库的思路还是很好的,禁止随意修改状态,只能通过触发事件来修改.中文文档在这里. 前面都很顺利,但是看到异步章节,感觉关于异步说得很乱 ...

随机推荐

  1. FFmpeg学习4:音频格式转换

    前段时间,在学习试用FFmpeg播放音频的时候总是有杂音,网上的很多教程是基于之前版本的FFmpeg的,而新的FFmepg3中audio增加了平面(planar)格式,而SDL播放音频是不支持平面格式 ...

  2. 欢迎阅读daxnet的新博客:一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统

    2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...

  3. java获取https网站证书,附带调用https:webservice接口

    一.java 获取https网站证书: 1.创建一个java工程,新建InstallCert类,将以下代码复制进去 package com; import java.io.BufferedReader ...

  4. 关于i++引出的线程不安全性的分析以及解决措施

    Q:i++是线程安全的吗? A:如果是局部变量,那么i++是线程安全. 如果是全局变量,那么i++不是线程安全的. 理由:如果是局部变量,那么i++是线程安全:局部变量其他线程访问不到,所以根本不存在 ...

  5. RPC是什么?科普一下

    RPC概念及分类 RPC全称为Remote Procedure Call,翻译过来为“远程过程调用”.目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程通信和相互调用 ...

  6. MyBatis的一系列问题的处理(遍历Map集合和智能标签和属性和字段不一样的解决办法 和sql片段)(三)

    一.字段名与属性名(数据库的名字)不一样怎么办? 方案一:在小配置中配置一个resultMapper <!--方案一:resultMapper 字段名与属性名不一致 --> <res ...

  7. 评《撸一段 SQL ? 还是撸一段代码? 》

    最近看到一篇博客<撸一段 SQL ? 还是撸一段代码?>,文章举例说明了一个连表查询使用程序code来写可读性可维护性更好,但是回帖意见不一致,我想作者在理论层面没有做出更好的论述,而我今 ...

  8. SpringMVC的执行流程(二)

    文字解析: 1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配 DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交 ...

  9. spring springMVC

    spring是一个开源框架,是为了解决企业应用程序开发,功能如下 目的:解决企业应用开发的复杂性 功能:使用基本的javabean代替EJB,并提供了更多的企业应用功能 范围:任何java应用 总之: ...

  10. 商业智能软件对比评测:FineBI和Tableau

    FineBI和Tableau是比较好的自助式商业智能软件,功能都很强大,是企业数据可视化不可或缺的利器,但两款产品还是有非常大的区别的,例如Tableau的功能全面且深入,更适合专业的数据分析人员,而 ...