2016-11-17 1 views
2

FirebaseからObservable<auth>というデータを取得し、それを公開変数auth$に入れます。Auth Auth複数回実行せずにコンポーネント間に観測可能な値を設定

私のアプリのどこかに、私は、その内容を確認するには、このauth$値にアクセスするには、複数のコンポーネントを必要としています。

現在、コンポーネントでthis.authService.auth$.subscribe(auth => this.auth = auth)を実行しています。

  1. それは私がfetch data from Firebaseを複数回実行してることを意味するのでしょうか?はい、私は件名/ BehaviorSubjectとして認証$を定義する必要がある場合は

  2. 、サービスに加入すると.nextでデータをプッシュ?

+0

FIrebaseは、いくつかの内部キャッシュを持っているので、それが問題になることはありません。 DevTools> Network> WebSocketsでネットワークトラフィックを確認することができます。 – Sasxa

+0

Firebaseについて知っておいてよかったので、これを確認します。しかし、httpコールはどうですか? (キャッシングなしのもの) – Tom

+0

['share()'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-share)演算子 'this。 authService.auth $ = Observable.of( 'whatever')。share() '。これはすべてのサブスクリプションで共有する必要があります。 – Sasxa

答えて

3

デフォルトでは、observableはマルチキャスト対応ではありません。これは、複数のサブスクリプションが独自のストリームを生成することを意味します。サブスクリプションごとに認証資格情報を再フェッチする必要がないので、元のストリームをマルチキャストと互換性を持たせる必要があります。これは、たとえばshare()演算子を使用して行われます。この演算子は、最初のサブスクリプション時にストリームをホットにし、その後のすべてのサブスクリプションのrefcountを内部的に格納します。

ストリームは、我々が放出された値を再生するための機能で構築する必要がホットになったとき、後半相手にしているサブスクリプションは、自動的に前の放射された値を取得することはできませんので。

shareReplay()演算子でこれらの条件を組み合わせると、マルチキャストを最新のnの値にすることができます。

だからあなたのコードは次のようになります。

const authStream = this.authService.auth$.shareReplay(1); 

// component 1 
const myAuthDisposable = authStream.subscribe(auth => this.auth = auth) 

// component 2 
const myAuthDisposable = authStream.subscribe(auth => this.auth = auth) 
+1

ありがとう!私は 'shareReplay()'を知らなかった。それは削除されたようです。それは '.publishReplay(1).refCount()'に置き換えなければならないと言っています(http://stackoverflow.com/questions/35246873/sharereplay-in-rxjs-5)。同意しますか? – Tom

+0

githubの問題での長い議論は、 '.publishReplay(1)'の動作がrxjs4と同じで、 'refCount()'と組み合わせて使うとうまくいくと思われるようです。私自身もそれをテストしていない。 –

関連する問題