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
。