2016-09-20 17 views
8

(バックエンドの高価な計算のため).share()演算子を使用しているオブザーバブルで非同期パイプを使用すると、この現象が発生しました:角2 + rxjs:.share()演算子を使用した非同期パイプ

data$ = (new Observable(observer => { 
    let counter=0; 
    observer.next(counter) 

    window.setInterval(() => { 
     observer.next(counter); 
     counter++; 
    }, 2000); 
    })) 
    .share(); 

テンプレート:

{{ (data$|async) !== null }} 
{{ (data$|async) !== null }} 

初期値の出力である:

true false 

次出力(2秒以上経過した後)は次のようになります。

これは私が最初の値として期待している動作です。 .share()を省略した場合、最初の値の出力は "true true"となります。上記の動作は、テンプレートの最初の式が観測可能な実行をトリガーし、2番目の非同期パイプが観測可能オブジェクトにサブスクライブすると、データは既に消失しているためです。この説明は正しいですか?そして、どうすればこの問題を回避できますか? the referenceによれば

+0

する必要があります。 observer.complete() ' – estus

+0

単一の値を持つ例はデモンストレーションのためのもので、私のアプリではobservableに複数の値があります – highwaychile

+0

あなたのケースを反映したコードを入力してください。 – estus

答えて

12

非同期パイプが観測またはプロミスに加入し、それが放射された最新の値を返します。

RxJS 4では、shareReplayが、目的の動作を達成するために使用されます。 RxJS 5において

shareReplayに直接対応はrefCountsee the explanationthe discussion)続いpublishReplayあります。

だから、単一の値があるようになっているので、それは `observer.next(...)である

data$ = (new Observable(observer => { ... })) 
.publishReplay(1) 
.refCount(); 
関連する問題