Mutiny库如何实现循环迭代顺序执行 前次结束后再启动下次
Mutiny 顺序执行异步任务实现方案
你当前的写法存在两个核心问题:
- 循环中直接调用
doSomethingAndReturnInUni()会立即触发异步任务执行,所有任务会并行运行,和你要的顺序执行逻辑相悖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
相关产品推荐
相关产品推荐

