对api.bookings的调用以预定义的顺序返回预订列表。对api.order()的调用会返回一个预订,但会有一些额外的信息。应用flatMap()后,预订列表的顺序搞砸了。 (bookings.toList()只是一个列表,如果预订)。如何按照.from(bookings.toList())发出的顺序获取zip函数中的值。注意:我不能使用toSortedList,因为我无法比较两个预订。
bookingsSubscription = api.bookings()
.flatMap(bookings ->
Observable.zip(
Observable
.from(bookings.toList())
.flatMap(booking -> api.order(booking.orderId)),
Observable.from(bookings.toList()),
(newBooking, oldBooking) -> {
// at this point newBooking != oldBooking
}
).toList())
.subscribe(callback);
api.order
答案 0 :(得分:7)
concatMap
将起作用,但不会提供您想要的并发性。另一方面concatMapEager
会。
等效选项是手动创建List<Observable>
并使用Observable.zip(Iterable, FuncN)
来组合列表。这与concatMapEager
具有相同的效果。
请参阅RxJava issue 3017进行讨论。
答案 1 :(得分:3)
使用.concatMap
代替.flatMap
http://fernandocejas.com/2015/01/11/rxjava-observable-tranformation-concatmap-vs-flatmap/
答案 2 :(得分:0)
api.bookings()
是否会返回热或冷观察?由于你遇到的问题,我觉得你的情况很冷。由于它是一个冷可观察,预订序列执行两次(并且zip运营商执行的所有订阅之间不共享状态)
首先,您可以使代码更简单易懂。您执行.toList()
时会删除Observable.from
方法调用,这会使您的列表“变平”。
bookingsSubscription = api.bookings()
.flatMap(coldBookings -> {
ConnectableObservable bookings = coldBooking.publish();
Observable zip = Observable.zip(
bookings.flatMap(booking -> api.order(booking.orderId)),
bookings,
(newBooking, oldBooking) -> {
// ...
});
bookings.connect();
return zip.toList();
})
.subscribe(callback);
我做了什么:删除无用的Observable.from(obs.toList())
并直接使用observable。
使用publish/connect
方法将冷可观察量转换为热可观察量
您可以在此处获取有关热/冷可观察的更多信息:http://www.introtorx.com/content/v1.0.10621.0/14_HotAndColdObservables.html