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

