如何获得最后发射的Observable

Fel*_*Fel 5 observable rxjs angular

我创建了一个Angular服务,该服务基本上设置了带有一些用户信息的对象。当我更改用户时,该服务将发出可观察到的信息,并由同级组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到一个未定义的值。我已经读过有关使用publish()或share()将可观察对象转换为“热”对象的信息,但是我对RxJS还是很陌生,但我仍然不了解它在100%的情况下如何工作,所以我有点迷失了。

服务代码(相关部分):

getFwcUser() : Observable<FwcUser> {
  return this.subjectFwcUser.asObservable();
}

setFwcUser(user : FwcUser) {
  this.fwcUser = user;

  this.subjectFwcUser.next(this.fwcUser);
}
Run Code Online (Sandbox Code Playgroud)

注意:FwcUser是带有某些用户字段的界面。我在按钮处理程序中运行setFwcUser以选择用户。

后期订阅者(组件代码):

ngOnInit() {
  this.fwcUserService.getFwcUser()
    .subscribe(
      (user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; }
  );
  [......]
}
Run Code Online (Sandbox Code Playgroud)

始终打印:“已接收:未定义”。注意:该组件位于'* ngIf =“ fwcUser”'内部,因此当我从同级组件调用'setFwcUser'时正在加载该组件。

如何获得该组件以读取丢失的值?

另外,有人可以为初学者推荐一个很好的资源来学习RxJS吗?我正在阅读有关Angular4的几本书,但没有一本书能清楚地解释它。

谢谢!

jos*_*hke 5

BehaviorSubject是这里的答案。BehaviorSubject而不是仅在传入时发出值的标准主题(Observable),而是发出on的最后一个值subscribe()。您还可以使用BehaviorSubjects getValue()方法手动获取最后一个值。

关于下面的代码,需要注意的一点是,nullBehaviorSubject声明中的块表示初始化时BehaviorSubject的初始值。您可以保留它,也可以使用值预先填充它。

服务

编辑:更正了几个键入错误。

fwcUser: BehaviorSubject<FwcUser> = new BehaviorSubject<FwcUser>(null);
fwcUser$ = this.fwcUser.asObservable();

// Set the value of the fwcUser
updateFwcUser(user) {
    this.fwcUser.next(user);
}
Run Code Online (Sandbox Code Playgroud)

零件

// 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();
}
Run Code Online (Sandbox Code Playgroud)