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

2022-08-30 00:03:47

我有一个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的当前值。我该怎么做?


答案 1

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

如果要具有当前值,请使用为此目的而设计的值。 保留最后发出的值,并立即将其发出给新订阅者。BehaviorSubjectBehaviorSubject

它还具有获取当前值的方法。getValue()


答案 2

您应该从可观察/主题中获取值的唯一方法是订阅!

如果你正在使用,你正在声明性范式中做一些命令式的事情。它是作为逃生舱口存在的,但99.9%的时间你不应该使用getValue()有一些有趣的事情可以做:如果主题已被取消订阅,它将引发错误,如果主题因错误而死亡,它将阻止您获得值,等等。但是,再一次,它是在极少数情况下作为逃生舱口而存在的。getValue()getValue()

有几种方法可以以“Rx-y”方式从主题或可观察中获取最新值:

  1. 使用 :但实际上订阅了它。当您首次订阅它时,它将同步发送它接收或初始化的上一个值。BehaviorSubjectBehaviorSubject
  2. 使用 a :这将缓存值并将其重播给新订阅者。ReplaySubject(N)N
  3. A.withLatestFrom(B):使用此运算符可在可观察发出时从可观察中获取最新值。将在数组中为您提供这两个值。BA[a, b]
  4. A.combineLatest(B):使用此运算符可以获取最新的值,并且每次发出 或 或 发出的值。将在数组中为您提供这两个值。ABAB
  5. shareReplay():通过 创建可观察多播,但允许您重试可观察时出错。(基本上,它为您提供了承诺式缓存行为)。ReplaySubject
  6. publishReplay()、 、 等:利用 和 的其他运算符。同一事物的不同风格,它们基本上是通过主题汇集所有通知来多播可观察的源。您需要调用以订阅具有主题的源。publishBehavior(initialValue)multicast(subject: BehaviorSubject | ReplaySubject)BehaviorSubjectReplaySubjectconnect()