【发布时间】:2018-02-06 05:48:11
【问题描述】:
Web 服务 API 有时使用分页,其中 Web 服务调用的参数指示要检索的页面。这些大致可以分为两种:
请求页面的参数独立于任何给定的页面响应(例如,“给我第 3 页,页面大小为 10”)
请求页面的参数依赖于之前的页面响应(例如,“在标识符为
foo的项目之后给我接下来的 10 个项目)
This SO answer 很好地涵盖了第一个场景,其中 Web 服务只需要一个页码,而我们需要从任何给定页面的响应中确定我们是否完成了。
This SO answer 涵盖了第二种情况,但它依赖于递归,因此对于大型数据集,我们将死于 StackOverflowError。
Relay 兼容的 GraphQL 支持的 Web 服务(例如 GitHub 的 API)将大量使用第二种情况,因为 Relay's specification for pagination 要求您从先前的响应中提供“光标”以获取之后的下一个项目光标位置。因此,我正在尝试为此找出一种非递归方法,它仍然将所有内容都包装到一个主 Observable 中,就像这两个答案一样。
【问题讨论】:
-
您仍然可以使用“递归”解决方案,并增加一些异步边界运算符 - 例如
Flowable.observeOn(Schedulers.io())- 内部Flowable调用 -
Web 服务 API 是阻塞还是返回 Observable?问题在于,为了使用 API,需要等待上一个结果完成才能请求下一个结果。如果您愿意阻止,那么解决方案很容易。