简体   繁体   English

RxJava2:仅当所有 observable 都发出错误时才发出错误

[英]RxJava2: Emit error only when all observables emitted error

I have multiple observables doing network calls and I need to emit error from combiner observable only when all observables emitted error.我有多个 observables 进行网络调用,并且只有当所有 observables 发出错误时,我才需要从组合器 observable 发出错误。 If at least one observable completes then the result should be passed.如果至少有一个 observable 完成,则应该传递结果。

My current stream functions like this:我当前的流功能是这样的:

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

I could just do:我只能这样做:

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}

But I wanted to know if there's a better way to handle this case.但我想知道是否有更好的方法来处理这种情况。

If I understand correctly, if there is at least one item from any of the networkObservable s, errors should be ignored, right?如果我理解正确,如果任何networkObservable中至少有一个项目,错误应该被忽略,对吗? In this case, you could detect the onNext s emitted, then in the error handler, suppress the error:在这种情况下,您可以检测发出的onNext s,然后在错误处理程序中抑制错误:

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
)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM