我有一个API,该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个元素,则会加载第一页和第二页,并且我的流量中包含150个元素。
但是,如果我请求100个元素,则会加载第一页和第二页(并且我的磁通包含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)
之后几乎就像在某些地方预取了一样,但是我看不到哪里。有什么想法吗?
答案 0 :(得分:1)
好,我找到了。每次都没有预取。实际上,<rewrite>
<rules>
<rule name="Redirect to http" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
<match url="*" negate="false" />
<conditions logicalGrouping="MatchAny">
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Found" />
</rule>
</rules>
</rewrite>
会在订阅而非请求时加载下一页。
快速(较脏)的测试可修复以下问题:
Flux.defer