多播(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
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/interval';
import 'rxjs/add/operator/publishLast';
import 'rxjs/add/operator/take';
const tick$ = Observable.interval(1000).take(3);
tick$.subscribe(value => console.log('observer 1: ' + value));
setTimeout(() => {
tick$.subscribe(value => console.log('observer 2: ' + value));
}, 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的接口,能够完成这两个职责。