等待两个可观察对象完成后再继续吗?

时间:2019-01-18 21:41:07

标签: java android observable retrofit2 rx-java2

  

我有一个加载页面,我想在其中执行两个网络请求(retrofit2-rxjava),以获取不相关的信息。在这两个请求完成之前,即使一个或两个都失败,我也不想继续下一页。

     
      
  1. 使用zip将请求捆绑在一起。有没有一种方法不被迫使用BiFunction并且不必返回null?

  2.   
  3. 请求A和B具有.doOnNext和.doOnError。如果其中之一返回错误,可观察到的zip会继续吗? zip订阅者还会返回错误吗?

  4.   
  5. 这是最好的方法吗?

  6.   
private Disposable retrieveBothThings() {
return Observable.zip(getThingA(), getThingB(),
                    (A, B) -> {
                        onAllCallsComplete();
                        return null;
                    })
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(o -> {}, Logger::e);
}



private Observable<...> getThingA() {
            return SessionManager.getInstance().getApi()
                    .getA()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .doOnNext(this::onACompleted)
                    .doOnError(this::onAFailed);
}

private Observable<...> getThingB() {
        return SessionManager.getInstance().getApi()
                .getB()
                .subscribeOn(Schedulers.io())
              .observeOn(AndroidSchedulers.mainThread()).toObservable()
                .doOnNext(this::onBSuccess)
                .doOnError(this::onBFailure);
}

private void onBSuccess(...) {
    ...        
}

private void onBFailure(final Throwable throwable) {
    Logger.e(throwable);
}

private void onACompleted(...) {
    ...        
}

private void onAFailed(final Throwable throwable) {
    Logger.e(throwable);
}

1 个答案:

答案 0 :(得分:1)

您可以使用merge()运算符组合两个可观察对象。您可以使用onComplete()将错误转换为onErrorResumeNext()

Completable.merge(
  observable1
    .doOnNext(this::onACompleted)
    .doOnError(this::onAFailed)
    .onErrorResumeNext( Completable.complete() )
    .toCompletable(),
  observable2
    .doOnNext(this::onBCompleted)
    .doOnError(this::onBFailed)
    .onErrorResumeNext( Completable.complete() ),
    .toCompletable() )
.subscribe( ignore -> {}, 
            error -> {},
            () -> { processCompletion(); } );