Mono嵌套调用返回顺序异常求助:响应提前返回未完成数据
解决Reactor Mono异步操作顺序问题
问题根源
你原来的代码里,map是同步处理逻辑,内部调用extendedWorkflowApiR.getExecutionStatus()返回的Mono没有被纳入响应式主流程——既没用flatMap这类操作符串联,也没正确触发订阅,所以主流程直接返回了原列表,而内部的异步请求还在后台执行,自然返回的列表没更新。
修正方案
核心思路是把列表拆成单个元素逐个处理,用flatMap等待每个内部异步调用完成,最后再合并成列表返回。修改后的代码如下:
public Mono<List<Workflow>> getWorkflows_0(String name, String correlationId, Boolean includeClosed, Boolean includeTasks) { return extendedWorkflowApiR.getWorkflows_0(name, correlationId, includeClosed, includeTasks) // 把Mono<List>转成Flux,逐个处理每个Workflow .flatMapIterable(wfList -> wfList) // 对每个Workflow做异步处理 .flatMap(wf -> { // 判断是否需要调用接口获取Tasks if (includeClosed && includeTasks && wf.getTasks().isEmpty()) { return extendedWorkflowApiR.getExecutionStatus(wf.getWorkflowId(), includeTasks) // 更新原Workflow的Tasks,或者直接返回新的Workflow .map(wfWithTasks -> { wf.setTasks(wfWithTasks.getTasks()); return wf; }); } else { // 不需要处理,直接返回原Workflow的Mono return Mono.just(wf); } }) // 把处理后的Flux重新合并成List,所有异步操作完成后才会返回这个列表 .collectList(); }
关键说明
flatMapIterable:将Mono<List<Workflow>>转换为Flux<Workflow>,逐个处理列表中的每个元素,避免同步循环导致异步操作脱离主流程的问题。flatMap:处理每个Workflow的异步逻辑,它会等待内部getExecutionStatus()返回的Mono完成后,再将结果传递到下一个步骤,保证异步操作的顺序和完成时机。collectList():将处理完的Flux<Workflow>重新合并为Mono<List<Workflow>>,只有当所有元素的异步处理都完成后,这个Mono才会发出最终的列表结果。
这样修改后,整个响应式流会等待所有内部异步接口调用完成,确保返回的列表是已经更新了Tasks的最终版本。
内容的提问来源于stack exchange,提问作者Josh Doeksen
相关产品推荐
相关产品推荐

