在用例与存储库中暂停

问题描述 投票:0回答:1

我有一个愚蠢的问题......但我找不到信息。

我创建了一个

Repository.kt
,它使用 Co-Routine

代码如下:

        override suspend fun getChallenge(): AwsResult<String> {
                return awsApi.getChallenge()
        }

AwsAPI部分完成如下:

override suspend fun getChallenge(): AwsResult<String> {
       ....

        return withContext(Dispatchers.IO) {
            try {
                val reponse: ... => API call through SDK
                AwsResult.onSuccess(reponse.text)
            } catch (e: Exception) {
                AwsResult.onError(e)
            }
        }
    }

我创建了一个

ChallengeUseCase.kt
,它将在将结果发送回 ViewModel 之前包含一些逻辑。

     suspend fun registerDevice(): Result<String> {
        try {
            val result = repository.getChallenge()
        } catch (e: Exception) {

        }
    }

AwsResult
看起来像:

sealed class AwsResult<out R> {
    data class onSuccess<out T>(val data: T) : AwsResult<T>()
    data class onError(val exception: Exception) : AwsResult<Nothing>()
}

我想知道如何捕获用例文件中的

AwsResult
?目标是提取信息,用它做一些事情,并将业务逻辑实现的结果发送回 viewModel。我认为
result
不会立即包含信息,并且我可能必须定义一个范围或周围的东西。

当我说时,我假设结果不会立即包含信息,这是因为我试图捕获

onSuccess
中的
onResult
UseCase.kt

有什么想法吗?

kotlin kotlin-coroutines repository-pattern coroutine suspend
1个回答
1
投票

您可以使用

onSuccess
运算符提取
onError
when
并检查返回的
result
的类型:

suspend fun registerDevice(): Result<String> {
    try {
        val result: AwsResult<String> = repository.getChallenge()
        when (result) {
            is AwsResult.onSuccess -> {
                val data = result.data
                // ... do something when request is success
            }
            is AwsResult.onError -> {
                val exception = result.exception
                // ... do something when request is error
            }
        }
        
    } catch (e: Exception) {

    }
}

另外,我不建议以小写字母开头命名 Kotlin 类,好的风格是以大字母开头命名类:

sealed class AwsResult<out R> {
    data class Success<out T>(val data: T) : AwsResult<T>()
    data class Error(val exception: Exception) : AwsResult<Nothing>()
}
© www.soinside.com 2019 - 2024. All rights reserved.