欢迎指导与讨论:)

  前言

    本文不涉及深入的知识,只是在概念层面和一个简单的例子解释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。

    

最新文章

  1. 纯css3图片旋转展示
  2. [Linux] linux下安装配置 zookeeper/redis/solr/tomcat/IK分词器 详细实例.
  3. WP8.1 C#代码 添加/获取Grid.ColumnDefinitions/RowDefinitions
  4. SQL server 查询某个表在哪些存储过程(SP)中使用到
  5. java第6次作业
  6. CF722C. Destroying Array[并查集 离线]
  7. HDU 1754 I Hate It (线段树)
  8. asp.net Get和Post传参和接收参数
  9. php配置相关
  10. C语言初学者代码中的常见错误与瑕疵(14)
  11. HDU1862EXCEL排序
  12. 给Sublime Text2安装轻量级代码提示插件:SublimeCodeIntel
  13. Hyperledger Fabric 1.0 从零开始(一)——吐槽
  14. Appium在Android7.0及以上系统运行时报错的解决方案
  15. 关于xml的相关知识
  16. TSMBIOS
  17. 前端学习 -- Css -- 内联元素的盒模型
  18. Coursera台大机器学习技法课程笔记13-Deep Learning
  19. python开发_configparser_解析.ini配置文件工具_完整版_博主推荐
  20. 创建Java不可变型的枚举类型Gender

热门文章

  1. Oracle数据库文件路径变更
  2. 【干货】”首个“ .NET Core 验证码组件
  3. XLT架构图(自己 画的)
  4. 在真机调试 iOS 应用:理解 Certificates, Identifiers &amp; Profiles
  5. 在 C# 中定义一个真正只读的 List
  6. TeamCity : 自动触发 Build
  7. Razor基础语法一
  8. C#——字段和属性
  9. [C1] 实现 C1FlexGrid 撤销还原功能
  10. PHP多图片上传实例demo