You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constsubject=newRx.Subject()subject.subscribe((value)=>console.log('A value: ',value))subject.subscribe((value)=>console.log('B value: ',value))subject.next(1)// A value: 1// B value: 1subject.next(2)// A value: 2// B value: 2
Subject可以订阅Observable,接受并转发值:
constobservable=Rx.Observable.from([1,2])constsubject=newRx.Subject()subject.subscribe((value)=>console.log('A value: ',value))subject.subscribe((value)=>console.log('B value: ',value))observable.subscribe(subject)// A value: 1// B value: 1// A value: 2// B value: 2
constsubject=newRx.BehaviorSubject(0)// 初始值为0subject.subscribe((value)=>console.log('A value: ',value))subject.next(1)// A value: 0// A value: 1subject.next(2)// A value: 2// B value: 2subject.subscribe((value)=>console.log('B value: ',value))subject.next(3)// A value: 3// B value: 3
ReplaySubject
ReplaySubject也是Subject的子类,被订阅时立即向订阅者推送最新指定数量的值。
constsubject=newRx.ReplaySubject(2)// 回放2个subject.subscribe((value)=>console.log('A value: ',value))subject.next(1)// A value: 1subject.next(2)// A value: 2subject.next(3)// A value: 3subject.subscribe((value)=>console.log('B value: ',value))// B value: 2// B value: 3subject.next(4)// A value: 4// B value: 4
constsubject=newRx.AsyncSubject()subject.subscribe((value)=>console.log('A value: ',value))subject.next(1)subject.next(2)subject.subscribe((value)=>console.log('B value: ',value))subject.next(3)subject.complete()// A value: 3// B value: 3
multicast、refCount、publish、share
在开头我们提到Subject就是一个Obserable,但新的订阅者会共用同一个执行环境:
constsource=Rx.Observable.interval(1000).take(3)constsubject=newRx.Subject()subject.subscribe((value)=>console.log('A value: ',value))source.subscribe(subject)setTimeot(()=>{subject.subscribe((value)=>console.log('B value: ',value))},1000)// A value: 0// A value: 1// B value: 1// A value: 2// B value: 2
Subject、BehaviorSubject、ReplaySubject、AsyncSubject
Subject
Subject
是Observable(可观察对象)
,每一个Subject
都有可以被subscribe(订阅)
,但不会创建新的执行环境,只会把新的Observer
注册到内部维护着的Observer清单
。Subject
是Observer(观察者)
,是一个由next()
,error()
,complete()
方法组成的对象,可以subscribe(订阅)
一个Observable
,并从其中接受到推送的值。每次
Subject
接收到值时,都遍历Observer清单
,并推送该值。Subject可以被订阅:
Subject可以订阅Observable,接受并转发值:
BehaviorSubject
BehaviorSubject
是Subject
的子类,拥有初始值
,并且总是保存着一个最新值
,一旦被订阅立即向订阅者发送最新值
。ReplaySubject
ReplaySubject
也是Subject
的子类,被订阅时立即向订阅者推送最新指定数量的值
。AsyncSubject
AsyncSubject
也是Subject
的子类,仅会在complete()
之后,向订阅者推送最后一个值
。multicast、refCount、publish、share
在开头我们提到
Subject
就是一个Obserable
,但新的订阅者会共用同一个执行环境:B
在1秒钟之后订阅,所以不会接受到第一个值0
。multicast
仔细看上面的例子,虽然定义的变量不多,但是这段代码的订阅关系还是略显复杂,这时候我们可以用
multicast
操作符来简化:这样一来,所有的订阅者都可以直接订阅
source
,其中的multicast
用于挂载一个Subject
,并返回一个ConnectableObservable
,拥有connect()
方法。注意的是,必须等到connect()
调用之后,Subject
才真正订阅source
并开始推送。connect()
方法会返回一个subscription
,可调用其unsubscribe
进行退订。refCount
refCount
必须搭配multicast
使用,用于创建一个只要有第一个订阅就会自动connect()
的Observable
,并且当订阅数变为0后会自动终止推送。publish
publish
是multicast
的简化写法:share
share
是publish
+refCount
的简化写法:参考资料
30 天精通 RxJS
The text was updated successfully, but these errors were encountered: