RxJava2 вопрос: как Zip обрабатывает ошибки при параллельном вызове нескольких сервисов? - PullRequest
0 голосов
/ 10 декабря 2018

Предположим, у нас есть 3 службы: employeeTitle, employeeName, employeeLocation.Если все сервисы трех сервисов выдают ошибку employeeTitle, employeeName и employeeLocation, то сервис выдает только 1 ошибку?Согласно документации это должно быть поведение это правильно?Что произойдет, если только employeeTitle выдает ошибку и другие службы будут успешными?Насколько я понимаю, если employeeTitle выдает исключение, тогда zip будет выбрасывать только 1 исключение, и это исключение будет ошибкой службы employeeTitle.Я на правильном пути?

-В моем коде ниже я ожидаю, что zip-ошибка появится в первом onErrorResumeNext внутри getEmployeeInfo ()

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 голосов
/ 10 декабря 2018

«Реактивный договор» гласит, что может быть только одно завершающее условие, либо onError, либо onComplete.Когда вы объединяете несколько цепочек наблюдателей с zip(), условия завершения из трех цепочек наблюдателей объединяются в одну.

Если ошибка возникает в первой цепочке наблюдателей, существует вероятность того, что ошибки могут возникатьв двух других.Однако оператор zip() выдает только первую ошибку.Кроме того, поскольку цепочки наблюдателей работают в отдельных потоках, будет происходить скачок, чтобы увидеть, какая ошибка сообщается;оно недетерминировано.

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

...