为了账号安全,请及时绑定邮箱和手机立即绑定

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

如何获取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的当前值即可。我怎样才能做到这一点?
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

一个SubjectObservable没有的电流值。发出值时,将其传递给订户并Observable使用它完成。

如果要使用当前值,请使用BehaviorSubject专门用于该目的的值。BehaviorSubject保留最后发出的值,并立即将其发送给新订户。

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


查看完整回答
反对 回复 2019-10-15
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

如果您使用的getValue()是声明式范例,则必须执行某些操作。它可以作为逃生舱口,但是99.9%的时间不应该使用getValue()有一些有趣的事情getValue()可以做:如果主题未订阅,它将引发错误;如果主题由于错误而死亡,它将阻止您获取值。等等。但是,再次出现是为了逃脱在极少数情况下孵化。

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

  1. 使用BehaviorSubject:但实际上是订阅它。首次订阅时BehaviorSubject,它将同步发送它收到或初始化时使用的先前值。

  2. 使用ReplaySubject(N):这将缓存N值并将其重播给新订户。

  3. A.withLatestFrom(B):使用此运算符可以B在可观察到的A发射时从可观察的获取最新值。将在数组中同时提供两个值[a, b]

  4. A.combineLatest(B):使用此操作来得到最新的值AB每一次无论是AB发出。将在数组中同时提供两个值。

  5. shareReplay():通过进行可观察的多播ReplaySubject,但允许您在发生错误时重试可观察的。(基本上,它为您提供了promise-y缓存行为)。

  6. publishReplay()publishBehavior(initialValue)multicast(subject: BehaviorSubject | ReplaySubject),等:其它运营商,充分利用BehaviorSubjectReplaySubject。相同事物的口味不同,它们基本上通过将所有通知集中到主题中来多播可观察的源。您需要致电connect()以订阅该主题的来源。


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 2561 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信