我正在迁移REST
来电使用Observable<T>
而不是:Call<T>
。对于简单的东西,它几乎是直截了当的,但我有点卡住这个......
我设法使用此链来浏览一个请求的页面:
Observable.range(1, 100)
.concatMap(pageNumber -> retrofitApi.itemsObservable(pageNumber))
.takeUntil(itemsResponse -> itemsResponse.list().isEmpty()
.reduce(items, itemsResponse -> items.addAll(itemsResponse.list())
.map(items -> new ArrayList(items))
到目前为止,这么好,但......令我困惑的是:如何理清后续步骤:
items
中的每个元素,发出另一个请求:retrofitApi.itemDetails(pageNumber)
,返回与元素相关的数据(尊重分页)items
)items
返回为:Observable<T>
元素答案 0 :(得分:0)
自己想出来。 flatMap()
似乎是这种情况的正确操作者。
这就是完整代码现在的样子:
Observable.range(1, 100)
.concatMap(pageNumber -> retrofitApi.itemsObservable(pageNumber))
.takeUntil(itemsResponse -> itemsResponse.list().isEmpty()
.reduce(items, itemsResponse -> items.addAll(itemsResponse.list())
.map(items -> new ArrayList(items))
// Make single item stream from list
.flatMap(items -> Observable.from(items))
// Now flatMap that to similar logic as above for paging
.flatMap(item -> getItemDetails(item))
// And return it back to List
.reduce(/* Basic add and return list reduce */);