我正在加载一些要在单个网页上显示的项目。与此同时,我正在加载物品的价格。简化它看起来像这样:
Observable<Integer> ids = itemIdsToShow(); // COLD Observable
Observable<Item> items = ids.flatMap(id -> loadingItem(id));
Observable<Price> prices = ids.flatMap(id -> loadingPrice(id));
更新:“商品”和“价格”均未订购。
现在我想和他们一起加入。
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“等待”看起来很奇怪。或者,我可以使用任何永远不会完成的Observable。实际上我需要一个可观察的,当“物品”和“价格”都完成时就完成了。
下一个建议不起作用。
Observable<Object> wait = items.mergeWith(prices).takeLast(1);
方法“join”再次订阅这个新创建的Observable,它启动新一代ID序列(一切从头开始)。
我很确定,在没有创建自定义实现的情况下,可以使用干净且美观的方式进行完全连接。
答案 0 :(得分: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)。