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

Kotlin协程场景下UseCase层如何处理Repository返回的AwsResult

协程中UseCase层处理AwsResult返回值实现方案

核心认知纠正

  • 同suspend上下文内直接调用其他suspend函数即可同步拿到返回值,不需要额外定义协程作用域。你之前分支匹配失败是密封类分支判断写法错误,不是返回值未正常返回。
  • 你当前AwsAPI层的实现已经通过withContext(Dispatchers.IO)完成IO线程切换,且内部已经捕获SDK请求的所有异常,封装为AwsResult.onError返回,正常调用时不会向外抛出请求类异常。

正确实现代码

ChallengeUseCase.kt 完整实现

suspend fun registerDevice(): Result<String> {
    // 直接调用挂起函数获取返回结果
    return when (val challengeResult = repository.getChallenge()) {
        is AwsResult.onSuccess -> {
            // 此处编写业务逻辑,challengeResult.data 即为接口返回的有效字符串
            val handleResult = challengeResult.data
            // 业务处理完成后返回成功结果给ViewModel
            Result.success(handleResult)
        }
        is AwsResult.onError -> {
            // 此处编写错误处理逻辑,challengeResult.exception 即为请求抛出的异常
            val error = challengeResult.exception
            // 返回错误结果给ViewModel
            Result.failure(error)
        }
    }
}

关键注意点

  • 匹配密封类分支时必须加is做类型判断,否则无法识别对应子类,也无法访问子类携带的data/exception字段,这是你之前匹配分支拿不到值的核心原因。
  • 原代码中包裹的try-catch可按需保留:如果你的业务处理逻辑(比如本地数据存储、字段解析)存在抛出异常的可能,可以保留外层try-catch,将捕获到的异常统一转为Result.failure返回;如果仅处理接口返回结果,可移除外层try-catch,避免重复捕获。
  • ViewModel层调用该方法时,直接使用viewModelScope.launch启动协程即可,拿到返回的Result后直接更新UI状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 10:03:37