RxJava2: выдает ошибку только тогда, когда все наблюдаемые испускают ошибку - PullRequest
0 голосов
/ 12 февраля 2020

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

Мой текущий поток работает следующим образом:

Observable.fromIterable(list)
.flatMap{networkObservable}
.reduce{combine result of all network observables to same list}

Я мог бы просто сделать:

Observable.fromIterable(list)
.flatMap{networkObservable.onErrorReturnItem(errorItem)}
.reduce{check if all items are error items and return error item otherwise combine result of 
all network observables to same list}

Но Я хотел знать, есть ли лучший способ справиться с этим делом.

1 Ответ

0 голосов
/ 12 февраля 2020

Если я правильно понимаю, если есть хотя бы один элемент из любого из networkObservable s, ошибки следует игнорировать, верно? В этом случае вы можете обнаружить испущенные значения onNext, затем в обработчике ошибок устранить ошибку:

Observable.using(
    () -> new AtomicBoolean(),
    hasItem -> Observable.fromIterable(list)
                         .flatMap(v -> networkObservable, true) // delay errors
                         .doOnNext(v -> {
                              if (!hasItem.get()) {
                                   hasItem.set(true);
                              }
                         })
                         .onErrorResumeNext(error -> {
                              if (hasItem.get()) {
                                  return Observable.empty();
                              }
                              return Observable.error(error);
                         }),
    () -> { } // no need to clean up the AtomicBoolean
)
...