Я унаследовал эту кодовую базу, которая использует RxJava2 и kotlin с довольно своеобразным шаблоном Result для вызовов API.т.е. все вызовы API возвращают Singles с объектом Result (который является запечатанным классом типов Success и Error, как показано ниже), т.е.
sealed class Result<T, E> {
data class Success<T, E>(
val data: T
): Result<T, E>()
data class Error<T, E>(
val error: E
): Result<T, E>()
}
Теперь я пытаюсь связать воедино кучу вызовов API этихно нужно завершить цепочку на первом Result.Error в нем и продолжить, если нет.
Единственный способ, которым я могу думать, - это сжать все синглы, а затем иметь функцию молнии, которая проверяет типкаждый параметр и возвращает Result.Error()
с первой ошибкой, с которой он сталкивается.то есть что-то вроде
Singles.zip(
repo1.makeCall1(arg),
repo1.makeCall2(arg2),
repo2.makeCall1(arg3)
) { result1, result2, result3 ->
val data1 = when (result1) {
is Result.Error -> return@zip Result.Error(result1.error)
is Result.Success -> result1.data
}
val data2 = when (result2) {
is Result.Error -> return@zip Result.Error(result2.error)
is Result.Success -> result2.data
}
val data3 = when (result3) {
is Result.Error -> return@zip Result.Error(result3.error)
is Result.Success -> result3.data
}
return@zip Result.Success(MergedData(data1, data2, data3))
}
, которое работает, но выглядит действительно странно (и похоже на запах кода при использовании этого метода с огромной задницей на молнии).Также не позволяет мне связывать что-либо еще после последнего метода (который проверяет, является ли Результат успехом / ошибкой).
Я чувствую, что было бы намного удобнее читать цепочку этих вызовов и завершатьна первую ошибку, но я не знаю достаточно Rx, чтобы сделать это.Есть оператор или подход, который может помочь сделать это лучше?