今天来说下rxjs中的单播和多播
单播
Observable实例只能被一个观察者订阅,如果它被多个观察者订阅,则会有多个实例,每次给出的流内容会重新给一遍给订阅者,下面是个例子:
export const ob = interval(500).pipe(take(4))
上面代码使用interval操作符创建一个observable,每隔0.5s发出一个数字,从0开始,通过take操符只取前4笔,即依次发出 0、1、2、3
在组件中订阅:
const a = ob
const b = ob
a.subscribe(console.log)
setTimeout(() => b.subscribe(console.log), 2000)
a和b订阅ob,b晚2s开始订阅,打印如下:
可以看到虽然b订阅的晚,但是订阅到了ob发出的全部数据
多播
Observable一个实例能被多个观察者订阅,多个订阅者订阅时,每个订阅者拿到的值都是实时发出的值,如果订阅时间错过了发出的时间则会订阅不到。可以使用Subject创建多播主体,创建的该主体实例通过next发出值,下面是个例子:
export const su = new Subject()
let i = 0
const timer = setInterval(() => {
i++;
su.next(i)
}, 1000);
setTimeout(() => {
clearInterval(timer)
}, 5000)
上面代码创建了一个多播主体,每隔1秒发出一个值,5s后不再发出值
在组件中订阅:
const c = su;
const d = su;
c.subscribe(console.log)
setTimeout(() => d.subscribe(console.log), 4000)
c先订阅su,4s后d开始订阅su
控制台打印结果如下:
因为d时4s后开始订阅,测试su之前发出的数据d拿不到,只能拿到开始订阅后发出的数据,即5