2016-08-14 7 views
0

コンテキスト:私は多くのConnectableObservableを持っています。ほとんどすべて再生回数が1以上です。ある時点で、オブザーバブルの購読と購読解除のオブザーバが多数存在します。RxJS:サブスクリプションの瞬間にのみ放出されるObservableデータをどのように購読しますか?

私が望むもの:多くの場合、オブザーバーがこれらのオブザーバブルの1つにサブスクライブすると、観測可能なデータ再生メカニズムのために受信した可能性のある既存の放出データが気になりません。最近購読されたオブザーバーが関心を持つ唯一のデータは、購読の瞬間の後に放出されるデータです。

const observable = Rx.Observable 
    .interval(100) 
    .take(4) 
    .publishReplay(3); 

observable.connect(); 

問題:は、私の知る限りは、観察者が観察可能に加入する際に、言うことができるように、それは観察データは、サブスクリプションの瞬間の前または後に放出されたかどうかを知る方法がありません。

observable.subscribe(x => console.log('observed', x)); 

setTimeout(() => 
    observable.subscribe(y => console.log('delayed observed', y)), 
    400 
); 

意志出力上のコード:

// => observed 0 
// => observed 1 
// => observed 2 
// => delayed observed 0 **don't care** 
// => delayed observed 1 **don't care** 
// => delayed observed 2 **don't care** 
// => observed 3 
// => delayed observed 3 

この仮定の状況では、遅延された観察者は、サブスクリプションの瞬間の後に放出されたデータにのみ関心があります。この場合、3

私はRxJS 5 reference docsを精査して、私が何をしているのかを達成するために銀色の弾丸操作を見つけることができないようです。何か案は?

+0

あなたはこれで解決しようとしている実際の問題とは何ですか?あまり抽象的な例はありませんか? – jonrsharpe

+0

誰がリプレイを必要としますか?遅延オブザーバーは、再生されないストリームのバージョンに加入することはできませんか? – Ptival

+0

お望みのものは、熱心に聞くことができます。この文書はhttps://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/creating.md#cold-vs-hot-observablesでご覧ください。 –

答えて

1

.skipUntil(Rx.Observable.timer(0))は、再生される要素が同期再生されるため、skipUntilは、再生の値を受け取るときに正確にその瞬間にObservableの残りの部分を同期実行から外すために使用できます。

このコードは、あなたが望む結果を生成します:

const observable = Rx.Observable 
 
    .interval(100) 
 
    .take(4) 
 
    .publishReplay(3); 
 

 
observable.subscribe(x => console.log('observed', x)); 
 

 
setTimeout(() => 
 
    observable 
 
     .skipUntil(Rx.Observable.timer(0)) 
 
     .subscribe(y => console.log('delayed observed', y)), 
 
    400 
 
); 
 

 
observable.connect();
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.4.3/Rx.min.js"></script>

0

このようなことはできますか?

const observableNoReplay = Rx.Observable 
    .interval(100) 
    .take(4); 

const observable = observableNoReplay 
    .publishReplay(3); 

observable.connect(); 

あなたは当時必要な観察可能なものを購読することができ、銀色の弾丸を心配する必要はありません。

関連する問題