あなたが何を求めているかについて具体的に分かっていれば、それは助けになると思いますが、私が理解しているところからはうまく見えます。
おそらく、flatMapの代わりにswitchMapを使いたいと思っています。 FlatMapは複数の内部サブスクリプションを維持しますが、SwitchMapは最新の内部オブザーバブルへのサブスクリプションのみを維持します。したがって、ソースの出力に基づいて内側のオブザーバブルからのみ値を取得したい場合は、switchMapがそれを行います。
あなたの使用例は不明ですが、Observable.empty()を返す代わりにフィルタを適用することを検討してください。ここで
は一例です:あなたはむしろflatMapよりswitchMapたいと思うように
const firstObservable = Rx.Observable.create((o) => {
o.next();
setTimeout(() => o.next(1), 1000);
setTimeout(() => o.next(), 2000);
setTimeout(() => o.next(2), 3000);
setTimeout(() => o.complete(), 4000);
}).do(console.log.bind(null, 'first: next'),
console.log.bind(null, 'first: error'),
console.log.bind(null, 'first: complete'));
const secondObservable = (x) => Rx.Observable.interval(x * 500).take(5)
.do(console.log.bind(null, 'second: next'),
console.log.bind(null, 'second: error'),
console.log.bind(null, 'second: complete'));
firstObservable.filter(x => x).switchMap(x => secondObservable(x))
.subscribe(console.log.bind(null, 'stream: next'),
console.log.bind(null, 'stream: error'),
console.log.bind(null, 'stream: complete'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.2/Rx.js"></script>
が鳴ります。それらの大きな違いは、最初の(ソース)が出るたびに、switchMapは2番目の観測可能(内部観測可能)を完了することです。 FlatMapは、最初の(ソース)が放出されたまま放つので、古い第2観測値(内部観測値)を完成させません。 – bygrace
Observableが同じ型を持たないため、実装がうまくいかないかどうかわかりません。flatMapを使用していないのは、他のソースからObservableを使用していて、someValueが未定義のときにエラーが発生するためです。観察可能な第1および第2として。 –
それ以外の「良い」とはどういう意味ですか?あなたが何をしようとしているのかは不明です。それは正しいアプローチのようです。 'r.someValue'が偽であるときにストリームを送出しないようにしたいのであれば、次のようにswitchmapの前でフィルタリングするだけです:' firstObservable()。filter(r => r.someValue).switchMap (r => secondObservable(r.someValue)); '。 – bygrace