Rxjs (ReactiveX)
简单介绍
- RxJS 是一个使用可观察序列编写异步和基于事件的程序的库。它提供了一种核心类型,即 Observable、一些周边类型(Observer、Scheduler、Subjects)和类似于 Array 方法(map、filter、reduce、every 等)的操作符,以便将异步事件作为集合进行处理。
可以将 RxJS 视为处理事件的 Lodash。
-
ReactiveX 将观察者模式与迭代器模式和使用集合的函数式编程相结合,以便让你更好地管理事件序列。
-
RxJS 中解决异步事件管理的基本概念有:
-
Observable(可观察者):表示未来(future)值或事件的可调用集合的概念。
-
Observer(观察者):是一个回调集合,它知道如何监听 Observable 传来的值。观察者物件回调属性(next、error、complete)
-
Subscription(订阅):表示 Observable 的一次执行,主要用于取消执行。
-
Operator(操作符):是纯函数,可以使用 map、filter、concat、reduce 等操作来以函数式编程风格处理集合。
-
Subject(主体):相当于一个 EventEmitter,也是将一个值或事件多播到多个 Observers 的唯一方式。
-
Scheduler(调度器):是控制并发的集中化调度器,允许我们在计算发生时进行协调,例如 setTimeout 或 requestAnimationFrame 或其它。
==自我总结(白话思考)== rxjs是一种流式数据操作和订阅处理的方式,打个比方:rx定于了一个管道,使得数据的流动类似于在一个管道之中进行流动传递,rx可以通过一些next()在水管的某个地方打开接口,向水管之中注入新的数据。同理,也可以通过新接入一个pipe管道,在接入的地方可以进行安装类似阀门的东西operator操作,对数据进行处理,处理完成之后继续向下流动,同时也可以通过在该接口的地方通过subscribe进行订阅观察,得到通过该接口的数据,进行其他的异步或者额外的操作。 通过数据管道的流动streams、处理、订阅等操作,在数据的不同的状态时刻进行不同的操作和处理,这样相当于将异步的操作进行串联,将事件处理的过程形成事件流。
简单上手
- 建立可观察的Observable物件
// 创建事件
const { formEvent } = "rxjs"
var click$=formEvent(document,"click")
- 建立观察者物件Observer
// 创建事件处理回调
// 可简化直接写入subscrible的回调之中
var observer = { next:(x)=>console.log(x)}
- 建立订阅物件(订阅Observable物件,并传入Observer观察者物件)
// 订阅事件,订阅事件才会触发observer进行回调处理
// 订阅,将事件与回调进行绑定,建立处理关系
// pipe()管道可以通过operator进行数据过滤处理
// subscrible订阅
const {filter,take } = "rxjs.operators"
var subs$ = click$.pipe(
filter(d=>d>100), // 过滤
take(4) // 限定次数,只取四次并且可以终止
).subscrible(observer)
- 取消订阅Subscription物件
// 取消订阅
subs$.unsubscrible()
Subject的用法(用于广播分发)
/* 1. 建立可观察的主体物件subject(用于主体物件之后进行广播) */
var subject = new rxjs.Subject()
/* 2. 建立可观察的Observable物件 */
var click$ = rxjs.fromEvent(document,"click")
/* 3.设定最多取两次数据之后就将Observable物件设为完成状态 */
click$=click$.pipe(take(2))
/* 4. 设定将click$全部交由subject主体物件进行广播 */
// ?? 这里类似于subject是处理函数,相当于click$将数据汇入subject主体,主体通过next()方法将数据下流,开放接口,从而使更多的人可以直接订阅subject来获取click$的数据
// Q?? 为什么不直接订阅click$,
// A!! 多次订阅需要多次触发,希望是一次触发一次订阅进行多种操作,借由subject进行阔流,实现一对多,一次订阅多次操作、不同操作。
click$.subscrible(subject)
/* 5. 再由subject去建立Observer观察者物件 */
var subs1$=subject.subscrible(d1=>console.log(d1))
var subs2$=subject.subscrible(d2=>console.log(d2))
/* 6.双分支事件各自取消订阅 */
subs1$.unsubscrible();
subs2$.unsubscrible();
operator 操作器讲解
相关解析网站:
RxJS Marbles [rxmarbles.com/]
RxJs Explore [reactive.how/]
- operator的分类
- 建立运算子
- 转换运算子
- 过滤运算子
- 组合运算子
- 多播运算子
- 错误处理运算子 catchError retry(count) 重复调用函数
- 工具函数运算子
- 条件式和Boolean运算子
- 数学运算子