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

Mutiny库如何实现循环迭代顺序执行 前次结束后再启动下次

Mutiny 顺序执行异步任务实现方案

你当前的写法存在两个核心问题:

  1. 循环中直接调用doSomethingAndReturnInUni()会立即触发异步任务执行,所有任务会并行运行,和你要的顺序执行逻辑相悖
  2. Uni.combine().all().unis()是组合所有并行执行的Uni,本身也不会做顺序调度

实现方式1:Uni 链式拼接(适合小数据量场景)

通过flatMap链式串联每个异步任务,保证前一个任务执行完成后,再触发下一个任务的创建和执行,同时累积结果:

Uni<List<T>> sequentialResult = Uni.createFrom().item(new ArrayList<T>());

for (T item : items) {
    sequentialResult = sequentialResult.flatMap(resultList ->
        // 只有上一个任务完成后,才会调用当前的doSomethingAndReturnInUni触发新任务
        doSomethingAndReturnInUni(item)
            .map(currentResult -> {
                resultList.add(currentResult);
                return resultList;
            })
    );
}

return sequentialResult;

实现方式2:Multi + concatMap (更简洁,适合全场景)

用Multi迭代输入集合,通过concatMap操作符天然的顺序执行特性实现需求,代码更简洁易读:

return Multi.createFrom().iterable(items)
        // concatMap严格保证前一个任务处理完成,才会触发下一个任务执行
        .onItem().concatMap(this::doSomethingAndReturnInUni)
        // 收集所有执行结果返回为列表
        .collect().asList();

核心注意点

  • 不要提前实例化所有Uni:只要调用了doSomethingAndReturnInUni(),对应的异步任务就会启动,不管你后续是否组合它,所以必须在需要执行时再调用该方法生成Uni实例
  • concatMap和flatMap的核心差异:flatMap会同时订阅多个上游任务实现并行,concatMap严格按顺序等待前一个任务终止后再订阅下一个,刚好匹配你要的顺序执行需求
  • 不需要手动订阅事件,Mutiny的标准操作符已经封装了任务调度逻辑,直接使用对应操作符即可满足需求

内容的提问来源于stack exchange,提问作者A.Casanova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 15:54:03