作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
中,就像这两个答案所做的那样。
最佳答案
如果 Web 服务 API 正在阻塞或者您愿意阻塞,那么解决方案很简单
Observable.generate(() -> new ApiResponse(page), (s, emitter) -> {
ApiResponse r = getResults(s.next);
emitter.onNext(r);
if (r.next == null) emitter.onComplete();
return r;
});
使用递归答案的符号。
如果不需要阻塞,您可以使用 RxJava2Extensions 中的 FlowableTransformers.expand
像这样
Flowable
.just(new ApiResponse(page))
.compose(FlowableTransformers.expand(r -> r.next == null ? Flowable.empty() : getResults(r.next)));
关于rx-java - 我们如何使用 RxJava 进行分页 Web 服务调用,其中每个页面都依赖于前一个页面的响应,而无需递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45927781/
我是一名优秀的程序员,十分优秀!