2016-10-19 6 views
1
.subscribe(
    new Action1<Response>() { 
     @Override 
     public void call(Response response) { 
      if (response.isSuccess()) 
      //handle success 
      else 
      //throw an Throwable(reponse.getMessage()) 
     } 
    }, 
    new Action1<Throwable>() { 
     @Override 
     public void call(Throwable throwable) { 
      //handle Throwable throw from onNext(); 
     } 
    } 
); 

Я не хочу обращаться (!response.isSuccess()) в onNext(). Как я могу бросить его на onError() и ручкой вместе с другими вместе?Как я могу бросить ошибку в onNext() с RxJava

ответ

6

If FailureException extends RuntimeException, то

.doOnNext(response -> { 
    if(!response.isSuccess()) 
    throw new FailureException(response.getMessage()); 
}) 
.subscribe(
    item -> { /* handle success */ }, 
    error -> { /* handle failure */ } 
); 

Это работает лучше всего, если вы бросаете исключение как можно раньше, так как тогда вы можете сделать повторные попытки , альтернативные ответы и т. д. легко.

2

вы можете flatMap свой ответ на ответ или ошибку

flatMap(new Func1<Response, Observable<Response>>() { 
     @Override 
     public Observable<Response> call(Response response) { 
      if(response.isSuccess()){ 
       return Observable.just(response); 
      } else { 
       return Observable.error(new Throwable(response.getMessage())); 
      } 
     } 
    }) 
0

Решение состоит в том, чтобы добавить оператора в центр. Мое предложение заключается в использовании map, поскольку это не создает новый объект Observable (по сравнению с flatMap, который делает это):

.map(new Func1<Response, Response>() { 
    @Override 
    public Response call(Response response) { 
     if (response.isSuccess()) { 
      return response; 
     } else { 
      throw new Throwable(reponse.getMessage())); 
     } 
    } 
}) 
+0

FYI: карта действительно создает новый объект наблюдаемого он просто делает это для вас внутри. – cyroxis

+0

этот код выйдет из строя – Sergey

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