我已经创建了一个 Angular 服务,它基本上设置了一个包含一些用户信息的对象。当我更改用户时,该服务会发出一个可观察对象,由一些同级组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到了一个未定义的值。我读过有关使用 publish() 或 share() 将可观察对象转换为“热”的信息,但我对 RxJS 还很陌生,我仍然不明白它是如何在 100% 下工作的,所以我有点迷茫。
服务代码(相关部分):
getFwcUser() : Observable<FwcUser> {
return this.subjectFwcUser.asObservable();
}
setFwcUser(user : FwcUser) {
this.fwcUser = user;
this.subjectFwcUser.next(this.fwcUser);
}
注意:FwcUser 是一个带有一些用户字段的接口(interface)。我在按钮处理程序中运行 setFwcUser 以选择用户。
迟到的订阅者(组件代码):
ngOnInit() {
this.fwcUserService.getFwcUser()
.subscribe(
(user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; }
);
[......]
}
总是打印:'Received: undefined'。 注意:该组件位于“*ngIf="fwcUser"”内,因此当我从同级组件调用“setFwcUser”时会加载它。
我怎样才能让这个组件读取最后一个值?
此外,有人可以推荐一个很好的资源来为初学者学习 RxJS 吗?我正在读几本关于 Angular4 的书,但没有一本能清楚地解释它......
谢谢!
最佳答案
BehaviorSubject是这里的答案。 BehaviorSubject 在 subscribe()
上发出最后一个值,而不是标准的 subject (Observable) 在值传入时发出值。您还可以使用 BehaviorSubjects getValue()
方法手动获取最后一个值。
关于下面的代码需要注意的是,BehaviorSubject 声明中的 null
block 表示初始化时 BehaviorSubject 的初始值。您可以保留它,也可以用一个值预先填充它。
服务
已编辑:更正了几个打字错误。
fwcUser: BehaviorSubject<FwcUser> = new BehaviorSubject<FwcUser>(null);
fwcUser$ = this.fwcUser.asObservable();
// Set the value of the fwcUser
updateFwcUser(user) {
this.fwcUser.next(user);
}
组件
// Subscribe to the BehaviorSubject
ngOnInit() {
this.fwcUserService.fwcUser$.subscribe(_fwcUser => {
this.fwcUser = _fwcUser
}
}
// Get the current (previously emitted) value manually
getFwcUser() {
this.fwcUser = this.fwcUserService.fwcUser.getValue();
}
关于angular - 如何获取最后发出的 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46302999/