Angular中为何调用setUsers()前Observable已包含数据?
问题解答:Angular中Observable在初始化前就包含数据的原因
你遇到的问题核心在于BehaviorSubject的特性,下面具体拆解:
- BehaviorSubject的本质
你在UserService里用了BehaviorSubject<User[]>([])来创建数据源,BehaviorSubject是RxJS里的一种特殊Subject,它的核心特点是:
- 必须传入一个初始值(这里你传了空数组
[]) - 会始终保存当前的“最新值”
- 当有新的订阅者订阅它转化出的Observable时,会立刻把当前的最新值推送给订阅者
- 对应到你的代码逻辑
- 服务初始化时,BehaviorSubject就已经持有了空数组这个初始值,对应的
usersObservable从创建起就和这个值绑定 - 你在服务构造函数里打印的
this.users是Observable对象本身,但当组件中的users$(或者模板里用async管道)订阅这个Observable时,会立刻收到BehaviorSubject的初始空数组,这就导致你看起来“在调用setUsers()之前就有数据” - 后续调用setUsers()发起API请求,拿到数据后调用
next(users),只是更新了BehaviorSubject的当前值,订阅者会收到新的用户数组
- 如何调整(可选)
如果不希望Observable一开始就有初始值,可以:
- 使用普通
Subject:它没有初始值,只有在调用next()之后,订阅者才能收到数据 - 使用
ReplaySubject:可以指定重播的历史值数量,但同样没有强制初始值
内容的提问来源于stack exchange,提问作者Safé
相关产品推荐
相关产品推荐

