Bac*_*tnz 160 javascript rxjs angular
我有一个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);
});
}
}
Run Code Online (Sandbox Code Playgroud)
一切都很好.但我有另一个不需要订阅的组件,它只需要在某个时间点获取isLoggedIn的当前值.我怎样才能做到这一点?
Gün*_*uer 276
A Subject或Observable没有当前值.当一个值被发出时,它被传递给订阅者并且Observable完成它.
如果您想拥有一个当前值,请使用BehaviorSubject专为此目的而设计的值.BehaviorSubject保留最后发布的值并立即将其发送给新订阅者.
它还有一种getValue()获取当前值的方法.
Ben*_*esh 124
如果你正在使用getValue()你在声明范式中做一些必要的事情.它在那里作为逃生舱,但99.9%的时间你不应该使用getValue().有一些有趣的事情getValue()可以做:如果主题已被取消订阅会抛出错误,如果主题因为错误而导致死亡等等,它将阻止您获取值.但是,再次,它会作为一个逃脱在罕见的情况下孵化.
有几种方法可以以"Rx-y"方式从Subject或Observable获取最新值:
BehaviorSubject:但实际订阅它.当您第一次订阅BehaviorSubject它时,将同步发送它收到的或之前初始化的值.ReplaySubject(N):这将缓存N值并将它们重播给新订阅者.A.withLatestFrom(B):使用此运算符可B在observable A发出时从observable获取最新值.将为您提供数组中的两个值[a, b].A.combineLatest(B):使用此操作来得到最新的值A和B每一次无论是A或B发出.将为您提供数组中的两个值.shareReplay():通过a进行可观察多播ReplaySubject,但允许您在出错时重试observable.(基本上它为您提供了承诺-y缓存行为).publishReplay(),publishBehavior(initialValue),multicast(subject: BehaviorSubject | ReplaySubject),等:其它运营商,充分利用BehaviorSubject和ReplaySubject.同一事物的不同风格,它们基本上通过汇集通过主题的所有通知来多播源可观察.您需要致电connect()订阅主题来源.我也遇到过类似的情况,即后期订阅者在其价值到达后订阅了该主题。
我发现ReplaySubject与BehaviorSubject相似,在这种情况下,它就像一个饰物。这是更好解释的链接:http : //reactivex.io/rxjs/manual/overview.html#replaysubject
小智 6
const observable = of('response')
function hasValue(value: any) {
return value !== null && value !== undefined;
}
function getValue<T>(observable: Observable<T>): Promise<T> {
return observable
.pipe(
filter(hasValue),
first()
)
.toPromise();
}
const result = await getValue(observable)
// Do the logic with the result
// .................
// .................
// .................
Run Code Online (Sandbox Code Playgroud)
您可以从此处查看有关如何实现它的完整文章。 https://www.imkrish.com/blog/development/simple-way-get-value-from-observable