2017-09-13 29 views
3

サブスクライバがいったんサブスクライバを持っていれば、ルックアップを実行して単一の値を出してから完了するという親があります。RxJS 5、ObservableをBehaviorSubject(?)に変換する

私は以下を行う観測可能な(または動作する対象など)ものに変換したい:少なくとも1人の加入者がいれば、それは親観察可能な(1回)結果を得る。次に、その値をすべてのサブスクライバに送信します。サブスクライバがサブスクライバに登録されると、そのすべてのサブスクライバにその単一の値を送信します。加入者数がゼロになってもこの動作を続ける必要があります。

これは簡単なようです。ここでは動作しませんでしたです:動作しませんでした

theValue$: Observable<boolean> = parent$ 
.take(1) 
.share() 

他のもの:publishReplay()publish()。より良い仕事を何か:このアプローチに問題があります

theValue$ = new BehaviorSubject<boolean>(false); 

parent$ 
.take(1) 
.subscribe(value => theValue$.next(value)); 

、しかし:parent$theValue$は、その第1の加入者を獲得する前に加入されます。

これを処理するより良い方法はありますか?

答えて

4

shareReplayは、あなたが欲しいものを行う必要があります。

import 'rxjs/add/operator/shareReplay'; 
... 
theValue$: Observable<boolean> = parent$.shareReplay(1); 

shareReplayはRxJSバージョン5.4.0で追加されました。最初のサブスクリプション時に、ソースにサブスクライブするリファレンスカウントオブザーバブル(parent$)を返します。ソースの完了後に行われる購読は、再生された通知を受け取ります。

shareReplay - およびrefCount一般的に - 私が最近書いた記事:RxJS: How to Use refCountで詳しく説明されています。

+0

これは動作するようです!私は少し驚きがないことを確認するために、それと一緒にプレーするつもりです。これは素晴らしそうです - 私は彼らがそれを作成したときにドキュメントにこれを追加したことを願っています。私は離れて行くことができる文書化されていない機能を使用しているように感じるのは好きではありません。しかし、私はそれをchangelogで追加されたものと見ているので、私はそれがここにあると推測しています。 – Karptonite

+0

それはあります。ドキュメントは進行中の作業です。とにかく 'publishReplay(1).refCount()'と非常に近いです。違いは微妙です。 – cartant

+0

非常に徹底的なブログ記事を読んだ後、私が実際に望むものは 'publishLast()。refCount'ですが、実際は私の場合は機能的にほぼ同じかもしれません。再度、感謝します! – Karptonite

関連する問題