2017-09-24 8 views
0

1つのWebページに表示するアイテムをロードしています。並行して、商品の価格を読み込んでいます。簡素化され、それは次のようになります。RxJava。 Observable/Flowableストリームからのすべてのアイテムに参加する

Observable<Integer> ids = itemIdsToShow(); // COLD Observable 
Observable<Item> items = ids.flatMap(id -> loadingItem(id)); 
Observable<Price> prices = ids.flatMap(id -> loadingPrice(id)); 

UPDATE:どちらも「項目」と「価格」は順序付けされていません。

今すぐ一緒に参加したいです。

Observable<Long> wait = Observable.interval(1000, TimeUnit.SECONDS); 
Observable<Pair<Item, Price>> pairs = items.join(prices, (ii)->wait, (pp)->wait, Pair::of); 

Observable<Item2> items2 = pairs.filter(p->p.a.id == p.b.id).map(p->new Item2(p.a, p.b)); 

Observable "wait"は異常です。あるいは、完了しないObservableを使用することもできます。実際には、私は "項目"と "価格"の両方が完了すると、完了する観察可能なものが必要です。

次の提案は機能しません。

Observable<Object> wait = items.mergeWith(prices).takeLast(1); 

方法「に参加」は、この新しい作成したID列の新世代を開始する、再び観測(およびすべてが最初から開始)サブスクライブします。私はかなり確信している

は、フルカスタム実装を作成せずに参加行うには、清潔で格好良い方法があります。

答えて

0

Zip operatorはこれを正確に行います。あなたたとえば、あなたのようなもので終わるだろう:

Observable.zip(Item, Price, Pair<Item, Price>)(items, prices, 
BiFunction { item, price -> 
    Pair(item, price) 
}) 

あなたは、より詳細hereに説明し、この例を見ることができます。

編集:更新された質問ごとに、flatMapは注文を保存しないため注文されません。代わりにチェックアウトconcatMapは(direct link to the marble diagram)です。

+0

観測の両方で同じ順序で生成されたデータかどうかは、のみ動作します。これは、フェッチ部分は非常に疑問に簡略化されている代わりにflatMap – 30thh

+0

チェックアウトconcatMap :-(ケースではありません。もともとそれは多重化および逆多重化を含む観測の長鎖から構成されています。私が交換した場合は、すべての「flatMapは」 "で呼び出しますconcatMap」、それはコードが読みにくくなり、それが同時実行のメリットを失うことになる。||||||この質問は、参加についてフェッチについてはあまりが、より多くのです。 –

+0

の – 30thh

関連する問題