了解rxjs

55 阅读2分钟

一个纯粹的响应式体系,用于解决在命令式编程语言中,处理一个数据序列时,消除同步/异步的差异的工具集。

尤其 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:

它们关键性的不同点:

ObservablePromise
使用场景同步、异步均可使用用 Promise 包裹的多数是异步场景
执行时机声明式惰性执行,只有在订阅后才会执行创建时就立即执行
执行次数多次调用 subscribe 函数会执行多次只有第一次执行,后续都是取值
流程控制相较于 Promise 有更为全面的操作符提供串行、并行的函数
错误处理subscribe 函数捕获错误.catch 捕获

在既使用了 RxJS 又引用了用 Promise 封装的库时,两者相互转换是容易碰到的问题,RxJS 提供了两者转换的函数