我有一个 API,它返回实体列表,实体数量上限为 100 个。如果有更多实体,它将返回下一页的令牌。
我想创建一个通量,它返回所有实体(所有页面),但仅在需要时(如果有请求)返回。
我写了这段代码:
class Page {
String token;
List<Object> entities;
}
Flux<Object> load(String token, final Function<String, Mono<Page>> fct) {
return fct.apply(token).flatMapMany(page -> {
if (page.token == null) {
// no more pages
return Flux.fromIterable(page.entities);
}
return Flux.fromIterable(page.entities).concatWith(Flux.defer(() -> load(page.token, fct)));
});
}
它有效 - 几乎
如果我请求 99 个元素,则加载第一页,并且我的通量包含 99 个元素。
如果我请求 150 个元素,则会加载第一页和第二页,并且我的 Flux 包含 150 个元素。
但是,如果我请求 100 个元素,则会加载第一页和第二页(并且我的 Flux 包含 100 个元素)。我的问题是,第二页已加载,但我没有请求第 101 个元素。
当前行为:
subscribe()
=> Function is called to load page 1
request(10)
=> Received: 0-9
request(89)
=> Received: 10-98
request(1)
=> Received: 99
=> Function is called to load page 2
request(1)
=> Received: 100
预期是:页面 2 的加载发生在最后一个请求之后(1)
几乎就像在某个地方进行了预取,但我看不到在哪里。有任何想法吗?
郎朗坤
相关分类