如何用flatMap以相同参数调用多个API?附代码问题
解决用相同参数同时发起多个API调用的问题
你的问题核心是:拿到lookupIdList后,需要用它同时调用bEnricher和cEnricher,但原来的链式调用会导致后续流中丢失lookupIdList的上下文,且两者返回类型/数量不同,没法用merge或zip直接合并。
直接修改buffer之后的逻辑,在同一个能访问lookupIdList的作用域里同时发起两个调用,再把两个操作的结果合并成Mono<Void>即可:
Mono<Void> enrich(List<String> idList) { return Flux.fromIterable(idList) .flatMap(id -> aEnricher.getAById(id)) // 修正原代码参数名错误:idList改为id .map(aEnrichResponse -> aEnrichResponse.getLookupId()) .buffer(10) .flatMap(lookupIdList -> { // 处理bEnricher调用及保存 Mono<Void> bTask = bEnricher.getBByLookupId(lookupIdList) .map(this::save) .then(); // 将流转换为Mono<Void>,仅关注操作完成状态 // 处理cEnricher调用及保存 Mono<Void> cTask = cEnricher.getCByLookupId(lookupIdList) .map(this::save) .then(); // 并行执行两个任务,等待全部完成后返回 return Mono.when(bTask, cTask); }); }
关键说明:
- 原代码第一个
flatMap的参数名写错(idList应为id),已修正。 - 在
buffer后的flatMap中,lookupIdList处于当前作用域,可直接传给两个API调用。 Mono.when用于并行执行两个独立任务,会等待两个Mono<Void>全部完成后再推进流,完美适配方法的返回类型。- 每个任务里的
.then()是把map处理后的流转换为Mono<Void>,只关心操作是否完成,不保留具体返回值。
内容的提问来源于stack exchange,提问作者cppcoder
相关产品推荐
相关产品推荐

