如何获取上次发布的Observable
问题描述:
我创建了一个基本上用一些用户信息设置对象的Angular服务。当我更改用户时,该服务会发出可观察的事件,并由一些兄弟组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到一个未定义的值。我已经阅读了关于使用publish()或share()将观察值转换为'hot'的内容,但我对RxJS很新,但我仍然不明白它是如何工作的,所以我有点迷路。如何获取上次发布的Observable
服务码(相关部分):
getFwcUser() : Observable<FwcUser> {
return this.subjectFwcUser.asObservable();
}
setFwcUser(user : FwcUser) {
this.fwcUser = user;
this.subjectFwcUser.next(this.fwcUser);
}
注:FwcUser是与一些用户字段的接口。我在按钮处理程序中运行setFwcUser以选择用户。
已故订户(组分代码):
ngOnInit() {
this.fwcUserService.getFwcUser()
.subscribe(
(user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; }
);
[......]
}
始终打印:“收到的:未定义。 注意:组件位于'* ngIf =“fwcUser”'内部,所以当我从同级组件调用'setFwcUser'时它被加载。
我怎样才能让这个组件读取丢失的值?
另外,有人可以推荐一个很好的资源来了解初学者的RxJS吗?我正在阅读Angular4上的几本书,但没有一本清楚地解释它...
谢谢!
答
BehaviorSubject就是这里的答案。 BehaviorSubject并不是一个标准主体(Observable),它只是在发送值时发出值,而是在subscribe()
上发出最后一个值。您还可以使用BehaviorSubjects getValue()
方法手动获取上一个值。
有关以下代码的一点注意事项是BehaviorSubject声明中的null
块表示初始化时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();
}
感谢您的快速回复!那么setFwcUser()函数是怎么样的呢?应该是这样的:? 'this.fwcUser = new BehaviorSubject(user);' – Fel
我更新了我的答案,以更新BehaviorSubject的最佳方式。您需要在服务中添加一个接受您想要发出的新值的函数,然后使用'next()'函数推出新值。 – joshrathke
再次嗨!对不起,我以前无法测试它,我一直很忙......我按照你的指示,它完美的工作!非常感谢你 :) – Fel