假设我有一个Android应用程序,其中包含以下Repository类,用于从API获取对象:
override fun fetchOrderById(orderId: Long): Single<List<ItemRow>> {
return api.fetchOrderByIdObservable(orderId)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map { orderResponse ->
orderResponse.items.map { deliveryItem ->
deliveryItem.asItemRow()
}
}
}
override fun fetchOrders(): Single<OrdersResponse> {
return api.fetchOrdersObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
override fun fetchAllOrders(): Single<List<ItemRow>> {
// TODO
}具有以下数据类:
class OrdersResponse(@SerializedName("orders") val orders: List<Long>)
class OrderResponse(@SerializedName("items") val items: List<DeliveryItem>)现在,我可以使用fetchOrderById在我的应用程序中将某个orderId的所有交付项(ItemRow)作为域对象显示在列表中。如何使用返回orderIds列表的fetchOrders来获取所有订单的所有送货项目?哪些运算符在这里会很有用?我尝试使用FlatMap,但是不能让它工作。文章的链接也是++。谢谢!
发布于 2020-10-23 19:28:41
你需要的运算符:switchMap(),flatMap(),fromArray(),toList(),map()它会是这样的:
fun fetchAllOrders(): Observable<List<ItemRow>> {
return fetchOrders()
.toObservable()
.switchMap { ordersResponse ->
Observable.fromIterable(ordersResponse.orders)
.flatMap {orderId -> fetchOrderById(orderId).toObservable() }
.toList()
.toObservable()
}
.map { list -> list.flatten() }
}发布于 2020-10-31 07:51:00
这最终起作用了:
public fun fetchAllItems(): Observable<List<ItemRow>> {
return networkService.api.fetchOrdersObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap { orderResponse -> Observable.just(orderResponse.orders) }
.flatMapIterable { id -> id }
.flatMap { id -> fetchOrderById(id) }
.flatMapIterable { itemRow -> itemRow }
.toList()
}https://stackoverflow.com/questions/64493901
复制相似问题