【问题标题】:How to get last emitted Observable如何获取最后发出的 Observable
【发布时间】:2017-09-19 14:24:15
【问题描述】:

我创建了一个 Angular 服务,它基本上设置了一个包含一些用户信息的对象。当我更改用户时,服务会发出一个 observable,由一些兄弟组件捕获以更新信息。问题是我第一次设置数据时,还没有人订阅,所以我得到一个未定义的值。我读过关于使用 publish() 或 share() 将 observable 转换为“热”的信息,但我对 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; }
  );
  [......]
}

总是打印:'Received: undefined'。 注意:该组件位于 '*ngIf="fwcUser"' 内,因此当我从同级组件调用 'setFwcUser' 时会加载它。

我怎样才能让这个组件读取最后一个值?

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

谢谢!

【问题讨论】:

标签: angular rxjs observable


【解决方案1】:

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();
}

【讨论】:

  • 感谢您的快速回复! setFwcUser() 函数会是什么样子?应该是这样的:? this.fwcUser = new BehaviorSubject(user);
  • 我用更新 BehaviorSubject 的最佳方式更新了我的答案。您需要在服务中添加一个函数来接受您要发出的新值,然后使用 next() 函数推出新值。
  • 您好!抱歉,我之前无法测试它,我真的很忙……我按照您的指示进行了操作,并且效果很好!非常感谢:)
  • 有没有办法使用它来获得最后 5 个发射,而不仅仅是一个?
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 2021-07-30
  • 2016-08-28
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多