Reactor Flux mergeWith 使用之前的值
Reactor Flux mergeWith using previous values
有没有办法通过合并多个Mono来创建Flux,合并后的Mono读取的是之前响应的值
类似的东西:
Flux<Integer> values = Mono.just(1).mergeWith( value -> Mono.just(value * 2));
您有 flatMapIterable
/flatMapMany
可以提供帮助,例如:
.flatMapIterable(v -> List.of(v, v*2))
为了后代和说明 sp00m 的答案,下面是一个示例,说明我如何结合递归使用此技术来调用 Youtube API 并导航抛出所有响应页面。
下一页id在getNextPagetoken()中的当前页给出
public Flux<VideoListResponse> getvideoListResponses() {
Videos.List request = ...
return videoListResponseFluxPaginated(request, null, true);
}
private Flux<VideoListResponse> videoListResponseFluxPaginated(Videos.List request, String pageToken, boolean firstCall) {
if(pageToken == null && !firstCall) return Flux.empty();
request.setPageToken(pageToken);
return Mono.fromCallable(request::execute)
.flatMapMany(videoListResponse -> Flux.merge(Flux.just(videoListResponse), videoListResponseFluxPaginated(request, videoListResponse.getNextPageToken(),false)))
;
}
有没有办法通过合并多个Mono来创建Flux,合并后的Mono读取的是之前响应的值
类似的东西:
Flux<Integer> values = Mono.just(1).mergeWith( value -> Mono.just(value * 2));
您有 flatMapIterable
/flatMapMany
可以提供帮助,例如:
.flatMapIterable(v -> List.of(v, v*2))
为了后代和说明 sp00m 的答案,下面是一个示例,说明我如何结合递归使用此技术来调用 Youtube API 并导航抛出所有响应页面。
下一页id在getNextPagetoken()中的当前页给出
public Flux<VideoListResponse> getvideoListResponses() {
Videos.List request = ...
return videoListResponseFluxPaginated(request, null, true);
}
private Flux<VideoListResponse> videoListResponseFluxPaginated(Videos.List request, String pageToken, boolean firstCall) {
if(pageToken == null && !firstCall) return Flux.empty();
request.setPageToken(pageToken);
return Mono.fromCallable(request::execute)
.flatMapMany(videoListResponse -> Flux.merge(Flux.just(videoListResponse), videoListResponseFluxPaginated(request, videoListResponse.getNextPageToken(),false)))
;
}