Rx Java map создает другой тип возврата в Kotlin - PullRequest
0 голосов
/ 17 января 2020

Я использую Rx Java с модернизацией, чтобы выполнять сетевые вызовы. В моем коде у меня есть вызов дооснащения, который возвращает Single<Result<List<SpoonacularResult>>>. У меня есть другая функция, которая вызывает функцию модернизации и использует карту для преобразования ее в Kotlin .Результат. Другая функция принимает Kotlin .Результат и заменяет его на другой Kotlin .Результат, чтобы мой пользовательский интерфейс мог получать результаты и делать что угодно. Проблема, с которой я сталкиваюсь, заключается в том, что после того, как getRecipesViewModel вызывает getRecipes, тип processingResult равен Single<Result<Result<List<SpoonacularResult>>>. Это происходит только тогда, когда мой getRecipesRetrofit возвращает ошибку, он работает совершенно нормально, когда возвращает успех. Я не уверен, откуда берется дополнительный Результат, заключающий в себе внутренний Результат. Ниже приведен мой код и несколько рисунков, чтобы проиллюстрировать то, о чем я говорю, поскольку ошибка немного странна для объяснения.

тип returnResult из getRecipes

processingResult от getRecipesViewModel

@GET("recipes/findByIngredients?number=50&ranking=2")
    fun getRecipesRetrofit(@Query("ingredients", encoded = true) ingredients: String, @Query("apiKey") apiKey: String)
            : Single<RxResult<List<SpoonacularResult>>>

fun getRecipes(ingredients: String): Single<KtResult<List<SpoonacularResult>>> {
        return spoonService.getRecipesRetrofit(ingredients, "ApiKey").map { result ->
            val processedResult = responseProcessor.process(result)
            val returnResult = if (processedResult.isFailure()) {
                KtResult.failure(processedResult.error!!)
            } else {
                KtResult.success(processedResult.body!!)
            }
            returnResult
        }
    }

fun getRecipesViewModel(set: MutableSet<String>): Single<Result<Int>> {
        val ingredients = setUpSet(set)
        return service.getRecipes(ingredients).map { processedResult ->
            val networkResult = if (processedResult.isFailure) {
                val error = processedResult.exceptionOrNull()!!
                Result.failure(error)
            } else {
                val resultBody = processedResult.getOrNull()!!
                if (resultBody.isNotEmpty()) {
                    CoroutineScope(Dispatchers.IO).launch {
                        recipeDao.clearRecipes()
                        resultBody.forEach {
                            recipeDao.insertRecipe(it)
                        }
                    }
                    Result.success(1)
                } else {
                    Result.success(2)
                }
            }
            networkResult
        }
    }
...