Rxjs的常用概念
1. Rxjs的基本概念
Observable
Observer
Subscription 作用是供调用者来终止执行,ConnectableObservable的connect()方法会返回该类型
Subject
Operators
Observer 就是实现该接口的一种对象
interface Observer<T> { void onCompleted(); void onError(java.lang.Throwable e); void onNext(T t); }
支持next和completed,类似于Promise
2. Rxjs Observable的创建
create
fromPromise
fromEvent
from
of
interval
range
操作符按照功能分类,大概有以下几个内容:
创建,即创建 Observable 的操作符,如 from、of、interval
转换 如 map、pluck
过滤 如 filter、last、take、throttle、debounce
合并 如 concat、merge、zip
多播 如 multicast
错误处理 如 catch、retry
辅助工具 如 do
条件分支 如 every、find、isEmpty
数学 如 count、max、min、reduce
3.Rxjs subject概念
Subject主要是用来进行多播的。
一般的 Observable 是单播的,每次订阅都会创建一个新的 Observable,产生新的数据流
Subject这个概念,就是用来将Observable转化为多播的。
Subject既是Observable,也是Observer
Subject的作用——作为单路Observable转变为多路Observable的桥梁。
Subject的类型
Subject 新的订阅加入,不会接收到之前推送的值,即Subject本身不具有存储功能
Subject的子类,具备存储值的功能
BehaviorSubject 只储存最新值,新的订阅,总是能接收的最新的那个值
ReplaySubject 存储指定数量和指定时间内的值,新的订阅,总是能接收存储的多个值
AsyncSubject 仅会在 Observable 执行完成后(例如subject的complete方法调用后),推送最后一个值
AsyncSubject 与 last() 操作符相似,等待完成通知后推送执行过程的最后一个值
![](https://img2022.cnblogs.com/blog/636026/202206/636026-20220607151835586-779651597.jpg)
4. Rxjs switchMap, mergeMap, concatMap, exhaustMap
concatMap: 串行执行, 前一个完成,才开始后一个
mergeMap: 并行执行
switchMap: 顺序执行, 后一个开始,会取消前一个,适用的场景较多 (在取消之前, 前一个执行较快, 也会有订阅输出, 不同于ajax的abort)
exhaustMap: 顺序执行, 前一个执行期间, 后一个发出会被丢弃, 直到前一个执行完成, 停止丢弃,开始接收新的
switchMap例子:
完整的拖曳事件
Rx.Observable.fromEvent(document, ‘mousedown’) .map(e => e.target) .switchMap(target => Rx.Observable.fromEvent(document, ‘mousemove’).map(e => { return { startX: target.offsetX, startY: target.offsetY, moveX: e.pageX, moveY: e.pageY, } })) .subscribe(pos => console.log(pos))
switchMap里面的函数接收mousedown这个流给的target,然后再返回一个新的关于mousemove的流,并且对这个新的流作map处理,过程中把前面的target也用上了。在switch发生的时候,mousedown的事件监听就给丢掉了。后面就全是跟mousemove相关的监听。
5. multicast 操作符
它可以应用于 observable,使其变成热的,即将observable转变为多播的,该操作符返回 ConnectableObservable 类型
6. publish 操作符用法
publish 操作符是对 multicast 操作符进行了一层薄薄的封装。它会调用 multicast 并传入 Subject
publish 操作符返回 ConnectableObservable 。调用 ConnectableObservable 的 connect 方法时,
负责多播基础结构的 subject 会订阅源 observable 并返回 subscription (订阅)。subject
会保持对源 observable 的订阅直到调用 subscription 的 unsubscribe 方法
publishBehavior 操作符,publishBehavior 传给 multicast 的是 BehaviorSubject,而不是 Subject
publishReplay 传给 multicast 的是 ReplaySubject,而不是 Subject
publishLast 传给 multicast 的是 AsyncSubject,而不是 Subject
7. refCount 操作符用法
ConnectableObservable 类型的 refCount() 方法作用
当订阅数从 0 到 1时refCount() 会调用connect() 方法。到订阅数从1 到 0,他会终止整个执行过程,Observable不再产生新数据
refCount 使得多路推送的Observable在被订阅后自动执行,在所有观察者取消订阅后,停止执行。
只有 ConnectableObservable 拥有refCount()方法,调用后会返回一个Observable而不是新的ConnectableObservable
当所有观察者都取消订阅后,自动取消 subject 对源 observable 的订阅
当所有观察者都取消订阅后,自动取消 subject 对源 observable 的订阅,然后当再有观察者订阅该引用计数的 observable 时,
subject 重新订阅源 observable
当 publish 和 publishBehavior 与 refCount 一起使用时,后来的订阅者只会收到 complete 通知,不适合
当 publishReplay 和 publishLast 与 refCount 一起使用时,后来的订阅者会收到预期的通知,适合
8. 冷、暖、热Observable
冷Observable | 暖Observable | 热Observable |
---|---|---|
单播、多个实例 | 多播、共享实例 | 多播、共享实例 |
订阅后才产生值 | 从第一个订阅者订阅后开始产生值 | 创建后立即产生值 |
订阅者拿到的都是相同的值 | 订阅者拿到的值取决于订阅时机 | 订阅者拿到的值取决于订阅时机 |
of、from... | share、shareReplay... | subject、fromEvent、publish... |
类比:看腾讯视频 | 类比:参加线下培训 | 类比:看新闻联播 |
出处: https://juejin.cn/post/6959003628816302087
出处: https://www.w3cschool.cn/article/237e60fd8aacc2.html
出处: https://juejin.cn/post/6861514628132765710
出处: https://www.bilibili.com/read/cv13462830
出处: https://blog.csdn.net/kongbaidepao/article/details/51240456
出处: https://blog.csdn.net/qq_26025363/article/details/100009556
出处: https://www.tangshuang.net/6105.html