Rxjs: 单播和多播

Rxjs

  • 单播 普通的 Observable 对象是单播的

单播的意思是,每个普通的 Observables 实例都只能被一个观察者订阅,当它被其他观察者订阅的时候会产生一个新的实例。也就是普通 Observables 被不同的观察者订阅的时候,会有多个实例,不管观察者是从何时开始订阅,每个实例都是从头开始把值发给对应的观察者。

  • BehaviorSubject

Subject 其中的一个变体就是 BehaviorSubject,它有一个“当前值”的概念。它保存了发送给消费者的最新值,当有新的观察者订阅时,会立即从 BehaviorSubject 那接收到“当前值”,在定义一个 BehaviorSubject 时需要有初始值, 所以它始终保持有一个最新的值可以发送给后来订阅的 observer。

  • ReplaySubject

类似于 BehaviorSubject,可以发送旧值给新的订阅者,但是不仅是‘当前值’,还可以是之前的旧值。

  • AsyncSubject

只有当 Observable 执行完成时(执行 complete()),它才会将执行的最后一个值发送给观察者。

类似于了 last 运算符,他会等到 Observable 结束的时候将最后一个值发出,如果先前订阅 observer 时该 Observable 对象还没有 complete 的话,那么这个 observer 就不会接收到值,知道 Observable 完结后,才会收到它的最后一个值,如果后订阅的 observer 来到时该 Observable 对象已经完结,那么它就可以 立即 收到这个 observable 发出的最后一个值

  • Cold Observable

Cold Observables 只有被 observers 订阅的时候,才会开始产生值。是单播的,有多少个订阅就会生成多少个订阅实例,每个订阅都是从第一个产生的值开始接收值,所以每个订阅接收到的值都是一样的。

  • Hot Observable

Hot Observables 不管有没有被订阅都会产生值。是多播的,多个订阅共享同一个实例,是从订阅开始接受到值,每个订阅接收到的值是不同的,取决于它们是从什么时候开始订阅。

在这个年纪我还有一整个未来去面对更好的自己,你们也是。

  • refCount 和 connect 的区别

refCount

当使用 refCount,是引用计数的 observable。
它表示当第一个订阅者开始订阅的时候,开始发送和产生值;
第二个订阅者(之后的订阅者)共享第一个订阅者的 Observables 实例,没有订阅者的时候,会自动取消订阅;之后再重新订阅,又从头开始发送值。

connect

当我们调用 ConnectableObservable.prototype.connect 方法,不管有没有被订阅,都会发送值。
订阅者共享同一个实例,订阅者接收到的值取决于它们何时开始订阅。在我们的例子中,第一个订阅等了一秒从 2 开始接受值,第二个订阅等了两秒从 3 开始接受值。

  • 单值:of, empty, never
    of 即使传递的是一个数组,那么他也是将数组作为一个整体的值传递下去

  • 多值:from
    如果传递一个数组/Iterator接口的数据,他会将数组的每一个值依次传递下去

都是将 cold Observable==> hot Observable 不会每次订阅都生成一个新的 observable 对象,可以用来缓存 http 请求的返回值。

  • multicast(new Subject()) / multicast(()=>new Subject()) ---> 实现多播

  • publish
    publish() <==> multicast(new Subject())

hotObservable.publish() .
所以它也需要 hotObservable$去 connect 或者是 refCount

  • share
    share() <===> multicast(() => new Subject()).refCount() 对的

    因为如果它的 multicast 里面是一个工厂函数返回一个新的 Subject 对象的话,那么如果一个 Observable 已经发出值,并且完结,那么后续再次订阅 share 返回的这个 observable 是,就会重新生成一个新的 subject,它还是可以接收到之前的 observable 发出的值,但是如果 multicast 里面是一个单纯的 Subject 实例时,这个实例完结之后再次订阅的 observer 就收不到值了

    缺点就是如果这个 Observable next 了值,那么后续的订阅不会在收到值

  • shareReplay(n) <===> multicast(()=>new Replay(n)).refCount()

    默认保存最后一个值

    可以设置保留的值的数量,如果 Observable 已经返回了值,那么下一次订阅的 Observer 就可以直接使用保留的值,而不会一无所获

你可能感兴趣的:(Rxjs: 单播和多播)