angular - 如何获取最后发出的 Observable

标签 angular rxjs observable

我已经创建了一个 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/

相关文章:

html - 图像方向 CSS 属性在 Angular 应用程序中不支持

css - 如何在 Angular 2 中进行响应式导航?

javascript - Rx.js 与 Promise 的并发

javascript - RxJS 使用第一个流的输出运行第二个流

Angular Material 嵌套拖放

angular - 在 Angular2 中显示进度条的最佳方式是什么?

javascript - rxjs 根据响应中指定的持续时间重复 api 调用

angular - Rxjs,带有一个参数的管道

javascript - Concat Array of Observables 并有一个单一的订阅输出

Android LiveData Observer 没有被第二次触发