RxJava Chain запрашивает и обновляет Observer из любого запроса - PullRequest
0 голосов
/ 07 июня 2019

У меня есть 3 запроса API, которые я обрабатываю с помощью RxJava Chaining (используя FlatMap).
Например: A, B, C

Запрос A дает ошибку HttCode 400. Поэтому я хочу, чтобы данные его тела ответа отображали сообщение об ошибке в пользовательском интерфейсе. Я обработал это в методе onError () и проанализировал данные тела. Но не знаю, как отправить его Наблюдателю, не останавливая цепочку. Если я использую. Observer.just (ErrorData). Он выбрасывает его в следующий запрос B FlatMap.

Запросы B & C зависят друг от друга. Запрос B выполняется после A. Я не хочу останавливать их выполнение, если в Запросе A произошла ошибка.

Так что мне нужны данные запроса об ошибке и данные об успехе C в Observer для отображения сообщения об ошибке и данных об успехе соответственно.

Кто-нибудь может предложить какую-нибудь идею, чтобы решить ее?

1 Ответ

1 голос
/ 07 июня 2019

Этого можно добиться, сопоставляя наблюдаемые типы с типом монада . т.е. Сопоставьте Observables с типом, который может содержать состояния как ошибки, так и состояния успеха. Если ошибка генерируется в наблюдаемом потоке A, тип ошибки распространяется с использованием onErrorResumeNext.

Отобразите наблюдаемые значения B и C таким образом, чтобы они могли содержать сообщение об ошибке от A. во время плоского отображения A с B, проверьте тип значения, испускаемого из A, и, если это значение типа ошибки, распространите сообщение об ошибке также на C

Вот пример, который я пробовал в kotlin

 val obs1 = Observable.create<Float> {
        throw IllegalStateException("Shit happens")
    }
    val obs2 = Observable.just(1)
    val obs3 = Observable.just("hii")

    obs1.map { Result(null, it) }.onErrorResumeNext { er: Throwable ->
        Observable.just(Result<Float>(er.message, null))
    }.flatMap { fltResult ->
        obs2.map { Result(fltResult.error, it) }
    }.flatMap { intResult ->
        obs3.map { Result(intResult.error, it) }
    }.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread()).subscribe({
            Log.d("Data: Error", it.data + ": " + it.error)
        }, {
            Log.d("Error", it.message)
        })

Результат класса

data class Result<T>(val error : String?,val data : T?)
...