如何获得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的当前值即可。 我怎样才能做到这一点?

SubjectObservable没有当前值。 当一个值被发射的时候,它被传递给订阅者, Observable就完成了。

如果要获取当前值,请使用专为此devise的BehaviorSubjectBehaviorSubject保留最后发出的值并立即将其发送给新的订阅者。

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

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

如果你使用getValue()你在声明式范例中做了一些必要的事情。 它在那里作为逃生舱口,但99.9%的时候你不应该使用getValue() getValue()会做一些有趣的事情:如果主体已经被取消订阅,它将会抛出一个错误,如果主体因为错误等原因死了,它将会阻止你获得一个值。但是,它在那里作为罕见情况下的逃生孵化器。

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

  1. 使用BehaviorSubject :但实际订阅它 。 当您第一次订阅BehaviorSubject ,它将同步发送它接收到的或者初始化的以前的值。
  2. 使用ReplaySubject(N) :这将cachingN值,并将它们重播给新的订阅者。
  3. A.withLatestFrom(B) :当可观察的A发出时,使用此运算符从可观察的B获取最近的值。 会在数组[a, b]给你两个值。
  4. A.combineLatest(B) :使用此运算符可以在AB每次发出时从AB获取最新的值。 会给你一个数组中的两个值。
  5. shareReplay() :通过ReplaySubject一个Observable多播,但允许您在出错时重试observable。 (基本上它给你的承诺,caching行为)。
  6. publishReplay()publishBehavior(initialValue)multicast(subject: BehaviorSubject | ReplaySubject)等:其他利用BehaviorSubjectReplaySubject运算符。 不同风味的同一件事情,他们基本上通过汇集所有通知通过主题组播观察源。 您需要调用connect()来订阅具有主题的来源。

我有类似的情况,迟到的用户订阅了这个主题。

我发现类似于BehaviorSubject的ReplaySubject在这种情况下就像一个魅力。 这里有一个更好解释的链接: http : //reactivex.io/rxjs/manual/overview.html#replaysubject