如何获得最后发出的Observable

时间:2017-09-19 14:24:16

标签: angular rxjs observable

我创建了一个Angular服务,它基本上设置了一个包含一些用户信息的对象。当我更改用户时,该服务会发出一个可观察的,由某些兄弟组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到一个未定义的值。我已经阅读过有关将观察结果转换为“热点”的信息。使用发布()或分享(),但我对RxJS很新,我仍然无法理解它是如何工作的100%,所以我有点迷失。

服务代码(相关部分):

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; }
  );
  [......]
}

始终打印:&#39;收到:未定义&#39;。 注意:该组件位于&#39; * ngIf =&#34; fwcUser&#34;&#39;内部,因此当我呼叫“setFwcUser”时,它会被加载。来自兄弟姐妹。

我怎样才能让这个组件读取丢失的值?

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

谢谢!

1 个答案:

答案 0 :(得分:3)

BehaviorSubject就是答案。一个BehaviorSubject在subscribe()上发出最后一个值,而不是在它们进入时发出值的标准主题(Observable)。您还可以使用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();
}