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

如何实现Kotlin Flow的顺序执行与失败重试逻辑?

解决方案:实现Flow的顺序执行与重试逻辑

完全可以实现你的需求,核心是通过顺序执行Flow替代并发的flattenMerge,并结合retry操作符处理重试逻辑。以下是具体实现方案:

改造后的代码示例

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

// 模拟可能失败的flow_1:可通过修改shouldFail变量测试失败场景
val flow_1 = flow {
    emit("loading_1")
    delay(100)
    emit("loading_1")
    delay(100)
    
    val shouldFail = false // 改为true模拟flow_1抛出error_1的情况
    if (shouldFail) {
        emit("error_1")
        throw RuntimeException("flow_1 failed with error_1")
    } else {
        emit("success_1")
    }
}.onEach { delay(100) }

val flow_2 = flowOf("loading_2", "loading_2", "success_2").onEach { delay(200) }

fun main() = runBlocking<Unit> {
    try {
        // 先处理flow_1,最多重试3次
        flow_1.retry(3) { cause ->
            println("flow_1失败,正在重试... 原因:${cause.message}")
            true // 表示继续重试
        }.collect {
            println("Result $it")
        }
        
        // flow_1成功完成后,立即启动flow_2
        println("flow_1执行成功,启动flow_2...")
        flow_2.collect {
            println("Result $it")
        }
    } catch (e: Exception) {
        // 3次重试失败后,终止所有流程
        println("flow_1经过3次重试仍失败,终止两个Flow")
    }
}

需求对应实现说明

  • 需求1:flow_1发出success_1后立即启动flow_2
    代码中先完整收集flow_1(确保其成功完成且无异常),之后才启动flow_2的收集操作。这种顺序执行的方式保证了flow_2只会在flow_1成功后启动。

  • 需求2:flow_1发出error_1时重试3次
    使用Flow的retry(3)操作符,指定最多重试3次。当flow_1抛出异常(模拟error_1场景)时,会自动触发重试,直到成功或耗尽重试次数。

  • 需求3:3次重试失败则关闭两个Flow
    若flow_1经过3次重试仍失败,会抛出异常并进入catch块,此时flow_2不会被启动,整个协程执行终止,两个Flow的收集流程都会被关闭。

原代码问题说明

你之前使用的flattenMerge是并发合并多个Flow,会同时启动flow_1和flow_2,因此无法满足顺序执行的要求。改用顺序收集+重试的方式即可解决问题。

内容的提问来源于stack exchange,提问作者Metropol_Tilkisi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:12:35