RxJS

Subject

Observable Subject BehaviorSubject ReplaySubject AsyncSubject
数据生成者 数据生成者和消费者 数据生成者和消费者 数据生成者和消费者 数据生成者和消费者
单播 多播 多播 多播 多播
每个订阅都会产生一个新的实例,每个订阅都是从第一个产生的值开始接收值,所以每个订阅接收到的值都是一样的 将值多播给已经注册监听该 Subject 的观察者们 立即把最新的一个值发送给新的观察者(实例化时需要初始值) 可以存储多个旧值并将它们重播给新的订阅者 把执行 complate 方法后的最后一个值发送给所有订阅者

Subject

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
  1. 我们创建了一个Subject
  2. 发出了一个值1,但由于此时并没有订阅者,所以这个值不会被订阅到
  3. 创建了订阅者 A
  4. 又发出一个值2,这时候订阅者 A 会接收到这个值
  5. 又创建一个订阅者 B
  6. 最后发出一个值3,这时候已经订阅的都会接收到这个值