多播(multicast)就是让一个数据流的内容 被多个Observer订阅。

1. 数据流的多播

播放内容的方式可以分为三种:

  • 单播(unicast)一个播放者对应一个接收者,RxJS支持
  • 广播(broadcast)所有接收者都可以收到,RxJS不支持,已经有现成方案,例如NodeJS中的EventEmitter
  • 多播(multicast)仅指定的接受者可以收到,RxJS支持

2. Hot和Cold数据流差异

看下面的例子,因为Cold Observable每次subscribe后都产生一个全新的数据流,输出结果为:

observer 1: 0 observer 1: 1 observer 2: 0 observer 1: 2 observer 2: 1 observer 2: 2

  1. import {Observable} from 'rxjs/Observable';
  2. import 'rxjs/add/observable/interval';
  3. import 'rxjs/add/operator/publishLast';
  4. import 'rxjs/add/operator/take';
  5. const tick$ = Observable.interval(1000).take(3);
  6. tick$.subscribe(value => console.log('observer 1: ' + value));
  7. setTimeout(() => {
  8. tick$.subscribe(value => console.log('observer 2: ' + value));
  9. }, 2500);

第2章介绍了 Hot Observable 和 Cold Observable 的区别,Cold的特征是,订阅者会拿到最开始吐出的数据结构。像interval、range这样的操作符都是Cold Observalbe操作符,对于这类Observable对象,每次调用subcribe的对象,其实相当于各自有一个独立的数据源头,也就是说 Hot Observable其实是单播。

R小JS提供了几个产生Hot Observable的操作符:fromPromise、fromEvent、fromEventPattern,它们的数据源通常来自外部,例如Promise、DOM、EventEmitter,真正的多播,是无论有多少Observer来subscribe,推送给Observer的数据都一样,满足这种条件的就是 Hot Observable。

在实际应用开发中,我们希望Observable 对象 subscribe多次,但是产生的是Hot Observable,这正是RxJS中Subject做的事。

3. Subject

函数式编程的世界中的一个要求是保持不可变性(Immutable),所以把Cold Observable 编程 Hot Observable的方法就是产生一个新的Observable对象,它既能接收上游推送的数据,又能提供subscribe来订阅数据。Subject类型既有Observable的接口,也有Subject的接口,能够完成这两个职责。