You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:10:29