Вложенный запрос с retrofit2 + rxjava и игнорирование ошибки в дочернем запросе

Я использую retrofit2 и изучаю RxJava (с Retrolambda). Я пытаюсь добиться следующего потока:

  1. получить список пользователей
  2. для каждого пользователя получить подробную информацию о пользователе для данного user_id.
  3. вернуть список пользователей с подробностями.

Это мой код до сих пор:

getUsers().flatMapIterable(users -> users)
flatMap(user -> getDetailInfo(user.getID()
        .doOnNext(detailInfo -> user.setDetailInfo(detailInfo))
        .map(detailInfo -> user))
.toList().subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
subscribe(users -> {}, error -> {});

Проблема в том, что когда getDetailInfo дал ответ 404, наблюдаемый вход в область ошибки, даже getUsers, дал ответ 200. Как мне получить ответ, входящий в область пользователя, если getUsers дал ответ 200?

Надеюсь, я был достаточно ясен. Спасибо


person Tobi    schedule 21.06.2016    source источник
comment
Вы пробовали с .onErrorReturn() ?   -  person KERiii    schedule 21.06.2016
comment
Я пытался добавить .onErrorReturn(throwable -> user) после .map. Это работает, но я хочу убедиться, что это правильная реализация? Благодарность   -  person Tobi    schedule 21.06.2016
comment
Я думаю, что это правильный путь, onErrorReturn инструктирует Observable генерировать определенный элемент, когда он сталкивается с ошибкой, а затем нормально завершается.   -  person KERiii    schedule 22.06.2016


Ответы (1)


Если вы хотите, чтобы ваш 404 не уничтожил ваш поток, вы должны использовать onErrorResumeNext, чтобы преобразовать свою ошибку в ответ по умолчанию, такой как null, и тогда ваш поток выживет, даже когда связанные запросы возвращают ошибку.

person Rodrigo Henriques    schedule 21.06.2016
comment
Где я должен поставить onErrorResumeNext? Я попытался поместить его в Observable getDetailInfo() с Observable.empty() в качестве возврата. Вместо получения списка пользователей я получаю пустой список. Благодарность - person Tobi; 21.06.2016
comment
«Observable.empty ()» выдает сигнал «onCompleted», попробуйте вместо этого выдать ноль - person Rodrigo Henriques; 21.06.2016
comment
Когда я добавляю .OnErrorResumeNext(throwable -> null), подписка входит в область ошибок. Если я добавлю .OnErrorResumeNext(throwable -> Observable.just(null)), подписка войдет в область успеха, но вернет пустой список пользователей. - person Tobi; 21.06.2016
comment
OnErrorResumeNext заменяет новый поток при обнаружении ошибки в Observable... не совсем то, что предполагалось. Я думаю, что он хочет, чтобы предыдущий наблюдаемый поток продолжался, если есть ошибка, и я тоже не знаю, как это сделать. У меня похожая проблема с REST API :-( - person kenyee; 20.07.2016