BehaviorSubject作为观察者时控制台无输出,改用next则正常,是否符合预期?
这是预期行为,原因拆解如下
这绝对是预期行为哦,背后是RxJS里BehaviorSubject作为Observer时的完整行为逻辑导致的,我给你拆解得明明白白:
先看你第一种写法
of(2).subscribe(bSubject)的完整执行流程:of(2)是个同步Observable,调用subscribe后会立刻触发两个操作:- 调用Observer(也就是你的bSubject)的
next(2)方法:这时候bSubject的当前值确实更新成了2,但此时你还没给bSubject添加订阅者,所以这个值暂时没人接收。 - 紧接着调用Observer的
complete()方法:这才是关键!BehaviorSubject继承自Subject,当Subject被调用complete()后,会直接进入终止状态——之后任何新的订阅者都不会收到任何值,哪怕之前存了最新值2也没用。
- 调用Observer(也就是你的bSubject)的
- 等你后面执行
bSubject.subscribe(data => console.log(data))时,bSubject已经是终止状态了,自然不会输出任何内容。
再看第二种写法
of(2).subscribe(data => bSubject.next(data))的区别:- 这里你手动写了一个简易Observer,只实现了
next方法,没有处理complete事件。所以of(2)发出值后,只会调用bSubject.next(2)更新它的当前值,不会触发bSubject的complete()方法。 - 当你后面订阅bSubject的时候,它还是活跃状态,会把最新的2推送给新订阅者,所以控制台就能正常输出啦。
- 这里你手动写了一个简易Observer,只实现了
额外验证小技巧:要是你把订阅bSubject的代码挪到 of(2).subscribe(bSubject) 之前,第一种写法也会输出1(初始值)和2——因为订阅者在bSubject被终止前就存在了,能收到next(2)的推送,之后bSubject才进入终止状态。
内容的提问来源于stack exchange,提问作者Hikmat G.
相关产品推荐
相关产品推荐

