Как получить ответ другого наблюдаемого при возникновении ошибки? - PullRequest
0 голосов
/ 17 октября 2018

Я просто хочу спросить, возможно ли получить ответ другой наблюдаемой после обнаружения ошибки другой наблюдаемой?

Например, я вызываю Аватар и Приложение в два API, используя combineLatest.

val avatar: Observable<ResponseBody> = api().getAvatar()
val attachment: Observable<ResponseBody> = api().getAttachment()

val obs = Observables.combineLatest(avatar, attachment)
        .map { it ->
            if (it.first is Exception) {
                Log.e(TAG, "getAvatar failed")
            } else {
                updateAvatar()
            }
            if (it.second is Exception) {
                Log.e(TAG, "getAttachment failed")
            } else {
                updateAttachment()
            }

            if (it.first !is Exception && it.second !is Exception) {
                Log.i(TAG, "success first=${it.first}, second=${it.second}")
                updateAll()
            }

        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .onErrorReturn { it }
        .subscribe()
disposable.add(obs)

Я просто хочу получить ответ аватара, если ошибка вложения, и я хочу получить ответ вложения, если ошибка аватара.

Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Да, мой друг.Вы можете обработать ошибку для каждой наблюдаемой комбинации, вызвав метод onErrorReturn().Вы можете использовать пустой ResponseBody для обнаружения ошибки.Окончательный код

val avatar: Observable<Optional<ResponseBody>> = api().getAvatar().onErrorReturn{ Optional.empty }
val attachment: Observable<Optional<ResponseBody>> = api().getAttachment().onErrorReturn{ Optional.empty }

val obs = Observables.combineLatest(avatar, attachment) {avatar, attachment -> 
        if (!avatar.isPresent()) {
            //logic
        }
        if (!attachment.isPresent()) {
            //logic
        }
    }.subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .onErrorReturn { it }
     .subscribe()

Если вы используете в своем проекте Java 7 или ниже, вы можете написать свой собственный Необязательный

class Optional<T>(val value: T?) {
        companion object {
            fun <T> empty(): Optional<T> = Optional(null)
        }

        fun isPresent() = value != null
    }
...