2016-04-16 4 views
1

У меня есть код, который вызывает 2 apis и объединяет результаты. используя модификацию и rxJava.Слияние результатов с использованием RxJava, ошибка обработки

Как я могу справиться с этим, чтобы, если есть проблема с одним из api, я все еще могу получить результат от одного из api, который действительно работал?

IPlaces api = adapter.create(IPlaces.class); //endpoint1 
    IPlaces api2 = adapter2.create(IPlaces.class); //endpoint2 

    Observable.combineLatest(
      api.getPlacesFrom1("key", placeId), 
      api2.getPlacesFrom2(placeId), 
     new Func2<PlaceDetailResult1, PlaceDetailResult2, MergedReviews>() { 
      @Override 
      public MergedReviews call(PlaceDetailResult placeDetailResult1, PlaceDetailResult2 placeDetailResult2) { 
       // processToMerge( placeDetailResult1, placeDetailResult2) 
       return mr; 
      } 

      }) 
      .subscribeOn(Schedulers.newThread()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<MergedReviews>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onNext(MergedReviews mr) { 

        SetAdapter(mr.reviews); 
        SetPhotosAdapter(mr.photos); 
       } 
      }); 
+0

Что вы подразумеваете под «если есть проблема»? Существует ли вызов onError, является ли 'placeDetailResult' недействительным или просто нет сообщения? –

+0

@PeterBarmettler Если один из Apis не работает, id по-прежнему выглядит как результат использования другого api, который будет использоваться. Он вступает в onerror (когда ia отключает один api), но мне все же хотелось бы получить результат от рабочего api до но я ничего не получаю – raklos

+1

Я думаю, проблема в том, что если вы объедините два наблюдаемых и один из них вызовет onError, комбинированный наблюдаемый также получит onError. Ответ на ваш вопрос зависит от того, сколько ошибок вы хотите. Если вам не нужно обращать внимание на ошибки, вы можете просто использовать '.onErrorResumeNext (e-> Observable.just (null))', а затем обрабатывать случаи «null» в закрытии 'combLatest'. В противном случае «mergeDelayError» может быть полезным. См. Также этот [post] (http://stackoverflow.com/questions/22340744/best-practice-for-handling-onerror-and-continuing-processing). –

ответ

1

Как указано в комментариях, вы можете превратить исключения в null объектов (или любой другой объект), используя onError*.

Вот минимальный пример, который, как я полагаю, отражает вашу настройку. Он принимает два целых наблюдаемых значения, которые обеспечивают одно значение Integer и каким-то образом сочетают их. Если один из наблюдаемых дает ошибку, передается другое значение, если оба дают ошибку, а бросается RuntimeException. Я использую zipWith вместо combineLatest, так как этого достаточно для вашего случая, когда от каждого из двух наблюдаемых ожидается ровно одно значение.

Observable<Integer> zipThrowing(Observable<Integer> observable1, Observable<Integer> observable2) { 
     return observable1.onErrorReturn(ex-> null) 
       .zipWith(observable2.onErrorReturn(ex->null), 
         (a,b)->{ 
          if(b == null) { 
           if(a==null){ 
            throw new RuntimeException("None of the two values are valid."); 
           } 
           return a; 
          } 
          if(a==null) { 
           return b; 
          } 
          return a+b; 
         } 
       ); 

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

+0

делает ZipTrowing/ZipWith ожидает, что аргументы одного типа? потому что в моем случае они представляют собой два разных типа, которые обрабатываются для вывода третьего типа. – raklos

+0

. Документация объявляет: 'public final Наблюдаемый zipWith (Observable other, Func2 zipFunction) ', поэтому да, вы можете объединить два аргумента другого типа, и вы можете вернуть произвольный тип' R'. –

Смежные вопросы