You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BehaviorSubject作为观察者时控制台无输出,改用next则正常,是否符合预期?

这是预期行为,原因拆解如下

这绝对是预期行为哦,背后是RxJS里BehaviorSubject作为Observer时的完整行为逻辑导致的,我给你拆解得明明白白:

  • 先看你第一种写法 of(2).subscribe(bSubject) 的完整执行流程:

    • of(2) 是个同步Observable,调用subscribe后会立刻触发两个操作:
      1. 调用Observer(也就是你的bSubject)的 next(2) 方法:这时候bSubject的当前值确实更新成了2,但此时你还没给bSubject添加订阅者,所以这个值暂时没人接收。
      2. 紧接着调用Observer的 complete() 方法:这才是关键!BehaviorSubject继承自Subject,当Subject被调用complete()后,会直接进入终止状态——之后任何新的订阅者都不会收到任何值,哪怕之前存了最新值2也没用。
    • 等你后面执行 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推送给新订阅者,所以控制台就能正常输出啦。

额外验证小技巧:要是你把订阅bSubject的代码挪到 of(2).subscribe(bSubject) 之前,第一种写法也会输出1(初始值)和2——因为订阅者在bSubject被终止前就存在了,能收到next(2)的推送,之后bSubject才进入终止状态。

内容的提问来源于stack exchange,提问作者Hikmat G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:03:59