我有一个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的当前值 . 我怎样才能做到这一点?
5 回答
您可以将最后一个发射值与Observable分开存储 . 然后在需要时阅读 .
我有类似的情况,后期订阅者在 Value 到达后订阅了主题 .
我发现ReplaySubject类似于BehaviorSubject就像在这种情况下的魅力一样 . 以下是更好解释的链接:http://reactivex.io/rxjs/manual/overview.html#replaysubject
你应该获得“观察者/主题”之外的唯一方法是订阅!
如果你正在使用
getValue()
你作为逃生舱,那么 99.9% of the time you should NOT use getValue().getValue()
会有一些有趣的事情:如果主题被取消订阅会抛出错误,如果主题已经死了,因为它是罕见情况下的逃生舱 .有几种方法可以以“Rx-y”方式从Subject或Observable获取最新值:
使用
BehaviorSubject
:但实际订阅了它 . 当您第一次订阅BehaviorSubject
时,它将同步发送它收到的或之前初始化的值 .使用
ReplaySubject(N)
:这将缓存N
值并将其重播给新订阅者 .A.withLatestFrom(B)
:当observableA
发出时,使用此运算符从observableB
获取最新值 . 将在数组[a, b]
中为您提供这两个值 .A.combineLatest(B)
:每次A
或B
发出时,使用此运算符从A
和B
获取最新值 . 将为您提供数组中的两个值 .shareReplay()
:通过ReplaySubject
进行可观察多播,但允许您在出错时重试observable . (基本上它为您提供了承诺-y缓存行为) .publishReplay()
,publishBehavior(initialValue)
,multicast(subject: BehaviorSubject | ReplaySubject)
等:利用BehaviorSubject
和ReplaySubject
的其他运营商 . 同一事物的不同风格,它们基本上通过汇集通过主题的所有通知来多播源可观察 . 您需要调用connect()
订阅包含主题的来源 .我在子组件中遇到了同样的问题,最初它必须具有Subject的当前值,然后订阅Subject以收听更改 . 我只维护服务中的当前值,以便组件可以访问,例如:
需要当前值的组件才能从服务中访问它,即:
不确定这是不是正确的做法:)
Subject
或Observable
没有当前值 . 当一个值被发出时,它被传递给订阅者并且Observable
完成了它 .如果要获得当前值,请使用专为此目的而设计的
BehaviorSubject
.BehaviorSubject
保留最后发出的值并立即将其发送给新订阅者 .它还有一个方法
getValue()
来获取当前值 .