Rxjs中的Subject是一种特殊的Observable,它允许将值传播到许多观察者。普通的Observable是单播的(每个订阅的Observable都拥有Observable的独立环境),但Subject是多播的。Subject就像是EventEmitters,它维护着许多听众的注册列表。
每个Subject都是一个可观察者(Observable)。给定一个Subject,你可以订阅它,提供一个Observable,它开始正常接收值。但是从Obserable的角度来看,它无法判断Observable执行是来自简单的单播Observable还是Subject。它既然是观察者,那么Subject是一个对象,并且具有方法next(v)、error(e)和complete()。要向Subject提供新的值,那么只需要调用next(v),这个值江北多播到已注册的观察者以监听这个Subject。例如:
1 | import {Subject} from 'rxjs'; |
我们创建了一个Subject,然后添加了两订阅函数,并且发出了一些值,可以看到,发出的值通过Subject被多播到了每一个订阅函数。
由于Subject是Observable,这也意味着我们可以提供Subject作为任何Observable的subscribe参数,例如:
1 | this.subject = new Subject<number>(); |
这样,我们可以通过Subject将单播Observable转换为多播。Subject也是唯一可以将Observable的执行共享给多个Obserfable的方法。
还有一些特殊类型的Subject:BehaviorSubject、ReplaySubject和AsyncSubject。