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() 操作符相似,等待完成通知后推送执行过程的最后一个值
 
 
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
posted @ 2022-03-01 19:49  全玉  阅读(245)  评论(0编辑  收藏  举报