猿问

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


天涯尽头无女友
浏览 2562回答 3
3回答

哈士奇WWW

一个Subject或Observable没有的电流值。发出值时,将其传递给订户并Observable使用它完成。如果要使用当前值,请使用BehaviorSubject专门用于该目的的值。BehaviorSubject保留最后发出的值,并立即将其发送给新订户。它还具有一种getValue()获取当前值的方法。

慕盖茨4494581

您应该&nbsp;从“可观察/主题”中获取值之外的唯一方法是订阅!如果您使用的getValue()是声明式范例,则必须执行某些操作。它可以作为逃生舱口,但是99.9%的时间不应该使用getValue()。有一些有趣的事情getValue()可以做:如果主题未订阅,它将引发错误;如果主题由于错误而死亡,它将阻止您获取值。等等。但是,再次出现是为了逃脱在极少数情况下孵化。有几种以“ Rx-y”方式从Subject或Observable获取最新值的方法:使用BehaviorSubject:但实际上是订阅它。首次订阅时BehaviorSubject,它将同步发送它收到或初始化时使用的先前值。使用ReplaySubject(N):这将缓存N值并将其重播给新订户。A.withLatestFrom(B):使用此运算符可以B在可观察到的A发射时从可观察的获取最新值。将在数组中同时提供两个值[a, b]。A.combineLatest(B):使用此操作来得到最新的值A和B每一次无论是A或B发出。将在数组中同时提供两个值。shareReplay():通过进行可观察的多播ReplaySubject,但允许您在发生错误时重试可观察的。(基本上,它为您提供了promise-y缓存行为)。publishReplay(),publishBehavior(initialValue),multicast(subject: BehaviorSubject | ReplaySubject),等:其它运营商,充分利用BehaviorSubject和ReplaySubject。相同事物的口味不同,它们基本上通过将所有通知集中到主题中来多播可观察的源。您需要致电connect()以订阅该主题的来源。
随时随地看视频慕课网APP
我要回答