#android #rx-java2 #rx-android
#Android #rx-java2 #rx-android
Вопрос:
У меня есть Observable<State> state
и этот фрагмент кода `
Flowable<.> loadData(){
return state.toFlowable(Latest).flatmap(this::fetchData()) }`
где fetchData()
возврат Flowable
но что, если у нас есть fetchData()
Single
возвращаемый тип, а loadData() возвращает Single<.>
Как я могу сопоставить Observable с Single?
Ответ №1:
Вы можете взять первый элемент .take(1)
и преобразовать в single с помощью следующих методов:
.single(defaultItem)
.singleElement()
.singleOrError()
Ответ №2:
Вот рабочее решение:
loadDataSingle()
.subscribeBy(
onSuccess = { println("This is your single data $it") },
onError = { println("We have a problem") }
)
fun loadDataSingle(): Single<String> {
return getState().singleOrError()
.flatMap {
fetchDataSingle()
}
}
fun fetchDataSingle(): Single<String> {
return Single.just("This is fetching your single data")
}
Или вы могли бы сделать это Single.fromObservable и обернуть вызов внутри него
fun loadDataSingle(): Single<String> {
return Single.fromObservable(getState())
.flatMap { fetchDataSingle() }
}
Комментарии:
1. Если
getState()
испускается более одного элемента, будет сигнализировано исключение.2. @lbasek и именно поэтому мы обрабатываем
onError
его на случай, если это произойдет. Есть ли у вас какое-либо альтернативное решение для этого?3. Я думаю, это просто вопрос реализации. Вы можете взять только первый элемент (
.take(1)
) и избежать исключения здесь.