一个纯粹的响应式体系,用于解决在命令式编程语言中,处理一个数据序列时,消除同步/异步的差异的工具集。
尤其 Angular 是重依赖 RxJS 的。
redux,mobx,rxjs 之间的关系
- redux: 全局状态管理
- rxjs: 管理所有输入的 input -> redux action 的调度过程
- mobx: 组件局部状态(component-state)管理器
当你的项目数据复杂度很高,redux + react 可以帮助你维持可预测性和可维护性的下降曲线不那么陡。所有 state 变化都由 action 规范化。
当你的项目数据复杂度很高且数据来源很杂,rxjs 可以帮助你把所有 input 规范化为 observable/stream,可以用统一的方式处理。
响应式编程
优势:
- 声明式,方便地表达静态或动态的数据流
- 自动化,自动将变化的值通过数据流进行传播
从传统的调用方“拉”数据的思维模式转变为被调用方“推”数据的思维模式
对比异步编程发展史:
-
Callback:运用高阶函数巧妙地将异步后的逻辑进行托管,以事件驱动的方式来解决异步编程。缺点是:回调地狱,耦合度高。
-
Promise:解决了回调嵌套的问题,虽然它只是回调的语法糖。弊端是:无法监听和打断 Promise 的状态。这意味着一旦声明它会立即执行并修改它的执行状态。
-
Generator:写异步语法像写同步一般。主要问题是流程管理不方便(迭代器模式实现,主动调 next
-
Async/await:Async/await 是 Generator 语法糖,既保留了语法上的优势,也解决了 Generator 每步要调一下 next 执行器的弊端,是现阶段的最佳方案
-
ReactiveX:ReactiveX,简称 Rx,是基于响应式的扩展,是各种语言实现的一个统称,包含 RxJS 等
注意:RxJS 擅长做异步的事,不代表不可以做同步或不擅长同步的事。
Observable 与 Promise:
它们关键性的不同点:
Observable | Promise | |
---|---|---|
使用场景 | 同步、异步均可使用 | 用 Promise 包裹的多数是异步场景 |
执行时机 | 声明式惰性执行,只有在订阅后才会执行 | 创建时就立即执行 |
执行次数 | 多次调用 subscribe 函数会执行多次 | 只有第一次执行,后续都是取值 |
流程控制 | 相较于 Promise 有更为全面的操作符 | 提供串行、并行的函数 |
错误处理 | subscribe 函数捕获错误 | .catch 捕获 |
在既使用了 RxJS 又引用了用 Promise 封装的库时,两者相互转换是容易碰到的问题,RxJS 提供了两者转换的函数