Rxjs(单播和多播)

289 阅读1分钟

今天来说下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开始订阅,打印如下:

rxjsdan.png 可以看到虽然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

控制台打印结果如下:

rxjs-subject.jpg 因为d时4s后开始订阅,测试su之前发出的数据d拿不到,只能拿到开始订阅后发出的数据,即5