0%

rxjs-subject

概述

今天来学习一下RxJS中的Subject,有人说它既是Observable,又是Observer,那么它到底是什么呢?先来看一下官方的定义:

1
Subject is equivalent to an EventEmitter, and the only way of multicasting a value or event to multiple Observers.

翻译一下:Subject等价于EventEmitter,是唯一一种将值或事件多播给多个观察者的方法。

Subject的特点

多播

下面的代码中,有两个订阅者,但是他们共享数据流,所以他们会输出相同的随机数。这就是Subject的多播特性。

1
2
3
4
5
6
import { Subject } from 'rxjs';

const subject = new Subject();
subject.subscribe((v) => console.log('observerA: ' + v));
subject.subscribe((v) => console.log('observerB: ' + v));
subject.next(Math.random());

但是如果改用observable, 那么每个订阅者都会收到一份数据,以下代码打印出不同的随机数。也就是说:对于普通的observable,每次订阅都会发起新的请求。一次订阅只能有一个观察者。

1
2
3
4
5
6
7
8
import { Observable } from 'rxjs';

const observable = new Observable((subscriber) => {
subscriber.next(Math.random());
});

observable.subscribe((v) => console.log(v));
observable.subscribe((v) => console.log(v));

总结

特性 Observable Subject
单播多播 单播 多播
数据产生时机 订阅时产生 由Subject.next()产生
冷热
是否是Observer
订阅时机的影响 每次订阅后产生新的数据 共享数据流,订阅后接收续生成的数据