首页 文章

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

提问于
浏览
106

我有一个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 回答

  • 4

    您可以将最后一个发射值与Observable分开存储 . 然后在需要时阅读 .

    let lastValue: number;
    
    const subscription = new Service().start();
    subscription
        .subscribe((data) => {
            lastValue = data;
        }
    );
    
  • 195

    我有类似的情况,后期订阅者在 Value 到达后订阅了主题 .

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

  • -3

    你应该获得“观察者/主题”之外的唯一方法是订阅!

    如果你正在使用 getValue() 你作为逃生舱,那么 99.9% of the time you should NOT use getValue(). getValue() 会有一些有趣的事情:如果主题被取消订阅会抛出错误,如果主题已经死了,因为它是罕见情况下的逃生舱 .

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

    • 使用 BehaviorSubject :但实际订阅了它 . 当您第一次订阅 BehaviorSubject 时,它将同步发送它收到的或之前初始化的值 .

    • 使用 ReplaySubject(N) :这将缓存 N 值并将其重播给新订阅者 .

    • A.withLatestFrom(B) :当observable A 发出时,使用此运算符从observable B 获取最新值 . 将在数组 [a, b] 中为您提供这两个值 .

    • A.combineLatest(B) :每次 AB 发出时,使用此运算符从 AB 获取最新值 . 将为您提供数组中的两个值 .

    • shareReplay() :通过 ReplaySubject 进行可观察多播,但允许您在出错时重试observable . (基本上它为您提供了承诺-y缓存行为) .

    • publishReplay()publishBehavior(initialValue)multicast(subject: BehaviorSubject | ReplaySubject) 等:利用 BehaviorSubjectReplaySubject 的其他运营商 . 同一事物的不同风格,它们基本上通过汇集通过主题的所有通知来多播源可观察 . 您需要调用 connect() 订阅包含主题的来源 .

  • 87

    我在子组件中遇到了同样的问题,最初它必须具有Subject的当前值,然后订阅Subject以收听更改 . 我只维护服务中的当前值,以便组件可以访问,例如:

    import {Storage} from './storage';
    import {Injectable} from 'angular2/core';
    import {Subject}    from 'rxjs/Subject';
    
    @Injectable()
    export class SessionStorage extends Storage {
    
      isLoggedIn: boolean;
    
      private _isLoggedInSource = new Subject<boolean>();
      isLoggedIn = this._isLoggedInSource.asObservable();
      constructor() {
        super('session');
        this.currIsLoggedIn = false;
      }
      setIsLoggedIn(value: boolean) {
        this.setItem('_isLoggedIn', value, () => {
          this._isLoggedInSource.next(value);
        });
        this.isLoggedIn = value;
      }
    }
    

    需要当前值的组件才能从服务中访问它,即:

    sessionStorage.isLoggedIn
    

    不确定这是不是正确的做法:)

  • 2

    SubjectObservable 没有当前值 . 当一个值被发出时,它被传递给订阅者并且 Observable 完成了它 .

    如果要获得当前值,请使用专为此目的而设计的 BehaviorSubject . BehaviorSubject 保留最后发出的值并立即将其发送给新订阅者 .

    它还有一个方法 getValue() 来获取当前值 .

相关问题