如何获取 RxJS Subject 或 Observable 的当前值?

新手上路,请多包涵

我有一个 Angular 2 服务:

import {Storage} from './storage';
import {Injectable} from 'angular2/core';
import {Subject}    from 'rxjs/Subject';

@Injectable()
export class SessionStorage extends Storage {
  private _isLoggedInSource = new Subject<boolean>();
  isLoggedIn = this._isLoggedInSource.asObservable();
  constructor() {
    super('session');
  }
  setIsLoggedIn(value: boolean) {
    this.setItem('_isLoggedIn', value, () => {
      this._isLoggedInSource.next(value);
    });
  }
}

一切都很好。但是我有另一个不需要订阅的组件,它只需要在某个时间点获取 isLoggedIn 的当前值。我怎样才能做到这一点?

原文由 williamsandonz 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

SubjectObservable 没有当前值。当一个值被发出时,它被传递给订阅者并且 Observable 完成了它。

如果您想获得当前值,请使用专为此目的而设计的 BehaviorSubjectBehaviorSubject 保留最后发出的值并立即将其发送给新订阅者。

它还有一个方法 getValue() 来获取当前值。

原文由 Günter Zöchbauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

应该 从 Observable/Subject 中“获取”值的唯一方法是订阅!

如果您使用的是 getValue() 您在声明性范式中做了一些必要的事情。它在那里作为逃生舱口,但 99.9% 的时间你不应该使用 getValue() getValue() 会做一些有趣的事情:如果主题已取消订阅,它将抛出一个错误,如果主题因为出错而死亡,它将阻止您获得值,等等。但是,同样,在极少数情况下,它可以作为逃生舱口。

有几种方法可以以“Rx-y”方式从 Subject 或 Observable 获取最新值:

  1. 使用 BehaviorSubject :但 _实际订阅它_。当您第一次订阅 BehaviorSubject 时,它将同步发送它收到或初始化的先前值。
  2. 使用 ReplaySubject(N) :这将缓存 N 值并将它们重播给新订阅者。
  3. A.withLatestFrom(B) :使用此运算符从可观察的 B 当可观察的 A 发出时。将为您提供数组中的两个值 [a, b]
  4. A.combineLatest(B) : Use this operator to get the most recent values from A and B every time either A or B 发出。会给你一个数组中的两个值。
  5. shareReplay() :通过 ReplaySubject 进行 Observable 多播,但允许您在出错时重试 observable。 (基本上它为您提供了 promise-y 缓存行为)。
  6. publishReplay() , publishBehavior(initialValue) , multicast(subject: BehaviorSubject | ReplaySubject) , etc: Other operators that leverage BehaviorSubject and ReplaySubject .同一事物的不同风格,它们基本上通过将所有通知汇集到一个主题来多播可观察到的源。您需要调用 connect() 订阅带有主题的源。

原文由 Ben Lesh 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题