RxJava2问题:并行调用多个服务时Zip如何处理错误?

时间:2018-12-10 05:34:23

标签: java android rx-java retrofit2 rx-java2

假设我们有3个服务,employeeTitle,employeeName, employeeLocation。如果所有服务三项服务均抛出错误 employeeTitle,employeeName和employeeLocation仅服务 抛出1个错误?根据文档,这应该是 这是正确的行为吗?如果只有employeeTitle抛出该怎么办 错误和其他服务是否成功?根据我的理解 如果employeeTitle抛出异常,则zip仍将抛出1 仅例外,此例外将是employeeTitle的服务 错误。我在正确的轨道上吗?

-在下面的代码中,我期望zip错误出现在getEmployeeInfo()内的第一个onErrorResumeNext中

Single<Model> getCompositeEmployeeInfo(){ 
  return Single.zip(
     api.employeeTitle()
       .subscribeOn(Schedulers.newThread()),
     api.employeeName()
       .subscribeOn(Schedulers.newThread()),
     api.employeeLocation()
       .subscribeOn(Schedulers.newThread()),
     new Function3<EmployeeTitle, EmployeeName, EmployeeLocation>() {

     @public Model apply(EmployeeTitle empTitle, EmployeeName empName,
                         EmployeeLocation empLocation){
       //some logic
     }

Single<Model2> getEmployeeInfo(){  
return getCompositeEmployeeInfo()
        .observeOn(AndroidSchedulers.mainThread())
        .onErrorResumeNext(throwable-> { 
           return Single.error(throwable}//I am expecting only 1 error(if 
            //more than one error is thrown) from 
            //zip, either employeeTitle, employeeName or employeeLocation.
         )
         .flatMap(model -> {
                 //some logic
           return getEmployeePreference();
                    .observeOn(AndroidSchedulers.mainThread())
                    .onErrorResumeNext(throwable -> {
                       return Single.error(throwable);
                    })
                   .flatMap(employeePreference -> {
                      //some logic
                      return Single.just(result);
           });  } }

1 个答案:

答案 0 :(得分:1)

“反应性合同”规定只能存在一个终止条件,即onErroronComplete。当您将多个观察者链与zip()结合使用时,来自三个观察者链的终止条件将被合并为一个。

如果第一个观察者链引发错误,则仍然有可能在其他两个观察者链中引发错误。但是,zip()运算符仅发出第一个错误。另外,由于观察者链在不同的线程上运行,因此将争分夺秒地报告错误。这是不确定的。

在观察者链终止后 ,或者当不再有下游处理错误的方式时,在观察者链中引发的错误将传递给全局处理程序。