Subject
Subject
是用于多播的Observable
,这意味着Subject
确保每个订阅都获得与订阅者之间共享可观察执行完全相同的值Observable | Subject | BehaviorSubject | ReplaySubject | AsyncSubject |
---|---|---|---|---|
数据生成者 | 数据生成者和消费者 | 数据生成者和消费者 | 数据生成者和消费者 | 数据生成者和消费者 |
单播 | 多播 | 多播 | 多播 | 多播 |
每个订阅都会产生一个新的实例,每个订阅都是从第一个产生的值开始接收值,所以每个订阅接收到的值都是一样的 | 将值多播给已经注册监听该 Subject 的观察者们 | 立即把最新的一个值发送给新的观察者(实例化时需要初始值) | 可以存储多个旧值并将它们重播给新的订阅者 | 把执行 complate 方法后的最后一个值发送给所有订阅者 |
Subject
其实是观察者模式的实现,所以当观察者订阅Subject
对象时,它会把订阅者添加到观察者列表中,每当有接收到新值时,它就会遍历观察者列表,依次调用观察者内部的next
方法,把值一一送出。
import { Subject } from 'rxjs';
const subject$ = new Subject<number>();
subject$.next(1);
// Subscriber A
subject$.subscribe((value:number)=>{
console.log(`订阅者A,订阅值为:${value}`);
})
subject$.next(2);
// Subscriber B
subject$.subscribe((value:number)=>{
console.log(`订阅者B,订阅值为:${value}`);
})
subject$.next(3);
// 控制台输出为:
// 订阅者A,订阅值为:2
// 订阅者A,订阅值为:3
// 订阅者A,订阅值为:3
Subject
1
,但由于此时并没有订阅者,所以这个值不会被订阅到2
,这时候订阅者 A 会接收到这个值3
,这时候已经订阅的都会接收到这个值