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

Kotlin中如何在getPaidInvoices失败时终止getInvoices函数执行

解决协程中API失败时终止后续执行的问题

针对你提出的需求,这里提供两种可行的实现方案,根据你是否能修改getPaidInvoices的代码来选择:

方案一:将getPaidInvoices改造为挂起函数(推荐)

回调式的API在协程场景下,改用挂起函数能更自然地利用协程的流程控制能力。

首先改造getPaidInvoices为挂起函数,成功时返回结果,失败时抛出异常:

private suspend fun getPaidInvoices() {
    try {
        // 执行原API请求逻辑,比如调用Retrofit接口等
        val result = apiService.getPaidInvoices()
        // 可在此处处理成功后的基础逻辑
    } catch (e: Exception) {
        // 将API失败的异常抛出,让上层协程捕获
        throw e
    }
}

然后在getInvoices中通过try-catch控制流程,失败时直接终止协程,后续API不会执行:

private fun getInvoices() = viewModelScope.launch {
    try {
        getPaidInvoices()
        // 仅当getPaidInvoices成功时,才执行后续API请求
        // another api function
    } catch (e: Exception) {
        // 处理getPaidInvoices的失败逻辑,执行完后协程终止,后续代码不会运行
    }
}

方案二:不修改getPaidInvoices,调整回调逻辑

如果无法修改getPaidInvoices的实现,可通过调整回调结构来控制后续代码的执行:

子方案1:将后续API放在onSuccess中

直接把后续API请求移到onSuccess回调内,这样只有当第一个API成功时才会触发后续请求:

private fun getInvoices() = viewModelScope.launch {
    getPaidInvoices(
        onSuccess = {
            // 第一个API成功,执行后续请求
            // another api function
        },
        onFailure = {
            // 处理失败逻辑,无后续代码执行
        }
    )
}

子方案2:取消当前协程

在onFailure中取消当前协程,强制终止所有后续执行:

private fun getInvoices() = viewModelScope.launch {
    val currentJob = this
    getPaidInvoices(
        onSuccess = {
            // 成功后执行后续API
            // another api function
        },
        onFailure = {
            // 取消当前协程,终止所有未完成的逻辑
            currentJob.cancel()
            // 处理失败逻辑
        }
    )
}

注意:如果后续API写在getPaidInvoices调用的外部(原代码位置),由于回调是异步的,协程可能会先执行后续API再触发onFailure,因此更稳妥的方式是将后续逻辑放在onSuccess内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:15:07