Поймай ошибку, но продолжай повторять список - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть функция в Kotlin, которая делает это:

 fun getItemByIds(ids: List<Long>): Single<List<Item>> {
    return Flowable.fromIterable(ids)
        .flatMapSingle { getItem(it) }
        .toList()
  }

Это работает хорошо, но в случае ошибки, сгенерированной getItem, такой как ошибка http 404, код не продолжается повторять.

getItem возвращает Single<>, но в случае ошибки http я возвращаю Single.error(it).

Что я хочу сделать, это убедиться, что список по-прежнему строится и в случае ошибки, я просто отклоняю ошибку и строю список с элементом, который генерирует ошибку.

Есть идеи?

1 Ответ

0 голосов
/ 03 мая 2020

Существует оператор Rx для решения вашей проблемы:

fun getItemByIds(ids: List<Long>): Single<List<Item>> {
        return Flowable.fromIterable(ids)
            .concatMapEagerDelayError({ id -> getItem(id).toFlowable() }, true).toList()
    }

В чем преимущества?

  1. Вы получите ошибку в конце (если есть), и Вы можете решить, что с ним делать, в зависимости от того, что это такое. Возможно, вы не захотите делать то же самое, если вы получите, например, NullPointerException вместо IOException.
  2. . Вы можете go гранулировать с перегруженной версией concatMapEagerDelayError, задавая такие вещи, как maxConcurrency.
  3. Вы даже можете сопоставить свои ошибки, используя onErrorResumeNext, чтобы узнать идентификаторы ошибочных элементов, или вы можете retry / retryWhen указать свою стратегию повторения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...