使用Retrofit根据Observable中的每个元素映射请求?

时间:2016-12-10 01:36:42

标签: java rx-java reactive-programming retrofit2

我正在迁移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))

到目前为止,这么好,但......令我困惑的是:如何理清后续步骤:

  1. 对于items中的每个元素,发出另一个请求:retrofitApi.itemDetails(pageNumber),返回与元素相关的数据(尊重分页)
  2. 将数据添加或映射到元素(items
  3. items返回为:Observable<T>元素

1 个答案:

答案 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 */);