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
相关产品推荐
相关产品推荐

