多播(multicast、share、publish)...
多播可以通过 Subject.asObservable 将Subject转成后Observable 使用操作符并订阅
如果不想显式调用 connect(),我们可以使用 ConnectableObservable 的 refCount() 方法(引用计数),这个方法返回 Observable,这个 Observable 会追踪有多少个订阅者。当订阅者的数量从0变成1,它会调用connect() 以开启共享的执行。当订阅者数量从1变成0时,它会完全取消订阅,停止进一步的执行
refCount的作用是,当有第一个订阅者时,多播 Observable 会自动地启动执行,而当最后一个订阅者离开时,多播 Observable 会自动地停止执行。
multicast
public multicast(subjectOrSubjectFactory: Function | Subject, selector: Function): Observable
返回的 Observable 发出对 ConnectableObservable 发出的项调用一个指定的 selector 函数的结果, ConnectableObservable 可以在潜在的多个流之间共享单个 subscription
let a = Rx.Observable.from([{name: 'hi'},{name: 'ho'},{name: 'he'},{name: 'ha'}]);
let b = a.multicast(() => new Rx.Subject());
b.subscribe(i => console.log(i));
b.subscribe(i => console.log(i));
let c = b.connect();
c.unsubscribe();
名称 | 类型 | 属性 | 描述 |
subjectOrSubjectFactory | Function | Subject | 用来创建中间 Subject 的工厂函数,源序列的元素将通过 该 Subject 多播到 selector函数,或者将元素推入该 Subject | |
selector | Function | 可选的 | 可选的选择器函数,可以根据需要多次使用以多播源流,而不会导致源流 生成多个 subscriptions 。给定源的订阅者会从订阅开始的一刻起,接收源的所有通知。 |
multicasted.connect();
connect() 方法十分重要,它决定了何时启动共享的 Observable 执行。因为 connect() 方法在底层执行了 source.subscribe(subject),所以它返回的是 Subscription,你可以取消订阅以取消共享的 Observable 执行。
share
public share(): Observable<T>
返回: Observable<T> Observable,订阅该 Observable 后向它的观察者同时发送数据。
publish
public publish(selector: Function): *
返回 ConnectableObservable,它是 Observable 的变种,它会一直等待,直到 connnect 方法被调用才会开始把值发送给那些订阅它的观察者。