gpt4 book ai didi

rx-java - 我们如何使用 RxJava 进行分页 Web 服务调用,其中每个页面都依赖于前一个页面的响应,而无需递归?

转载 作者:行者123 更新时间:2023-12-02 01:09:12 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com