如何获得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的当前值即可。 我怎样才能做到这一点?
Subject
或Observable
没有当前值。 当一个值被发射的时候,它被传递给订阅者, Observable
就完成了。
如果要获取当前值,请使用专为此devise的BehaviorSubject
。 BehaviorSubject
保留最后发出的值并立即将其发送给新的订阅者。
它也有一个方法getValue()
来获取当前值。
您应该从“Observable / Subject”中获取值的唯一方法是订阅!
如果你使用getValue()
你在声明式范例中做了一些必要的事情。 它在那里作为逃生舱口,但99.9%的时候你不应该使用getValue()
。 getValue()
会做一些有趣的事情:如果主体已经被取消订阅,它将会抛出一个错误,如果主体因为错误等原因死了,它将会阻止你获得一个值。但是,它在那里作为罕见情况下的逃生孵化器。
以“Rx-y”方式从Subject或Observable获取最新值有几种方法:
- 使用
BehaviorSubject
:但实际订阅它 。 当您第一次订阅BehaviorSubject
,它将同步发送它接收到的或者初始化的以前的值。 - 使用
ReplaySubject(N)
:这将cachingN
值,并将它们重播给新的订阅者。 -
A.withLatestFrom(B)
:当可观察的A
发出时,使用此运算符从可观察的B
获取最近的值。 会在数组[a, b]
给你两个值。 -
A.combineLatest(B)
:使用此运算符可以在A
或B
每次发出时从A
和B
获取最新的值。 会给你一个数组中的两个值。 -
shareReplay()
:通过ReplaySubject
一个Observable多播,但允许您在出错时重试observable。 (基本上它给你的承诺,caching行为)。 -
publishReplay()
,publishBehavior(initialValue)
,multicast(subject: BehaviorSubject | ReplaySubject)
等:其他利用BehaviorSubject
和ReplaySubject
运算符。 不同风味的同一件事情,他们基本上通过汇集所有通知通过主题组播观察源。 您需要调用connect()
来订阅具有主题的来源。
我有类似的情况,迟到的用户订阅了这个主题。
我发现类似于BehaviorSubject的ReplaySubject在这种情况下就像一个魅力。 这里有一个更好解释的链接: http : //reactivex.io/rxjs/manual/overview.html#replaysubject