Цепочка вызовов модификации с RxJava

Итак, в основном, что я пытаюсь сделать, это сделать первый сетевой вызов. И если вызываемая веб-служба RESTful возвращает 1, сделайте второй сетевой вызов. Если веб-служба возвращает 0, второй сетевой вызов не выполняется.

Вот мой код

final ApiInterface apiInterface=restAdapter.create(ApiInterface.class);
apiInterface.submitDataToAnalyze("dataToAnalyze","852741963",1,"123","lalala","2015-11-20")
   .flatMap(new Func1<BasicResponse, Observable<?>>() {
    @Override
    public Observable<?> call(BasicResponse basicResponse) {
        if (basicResponse.getResult() == 1){
           return apiInterface.getSuggestion("dataToAnalyze","852741963",1,"123","lalala","2015-11-20");
         }else{
            return 0; //error
         }
  }
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());

Очевидно, что приведенный выше код неверен, так как он всегда должен возвращать Observable. Итак, как должен быть написан мой код, если первый сетевой вызов возвращает 0?


person imin    schedule 20.11.2015    source источник
comment
Как насчет того, чтобы просто вернуть ноль?   -  person Niko Adrianus Yuwono    schedule 20.11.2015
comment
@NikoYuwono, это хорошая практика?   -  person imin    schedule 20.11.2015
comment
Не совсем, смотрите мой ответ ;)   -  person Niko Adrianus Yuwono    schedule 20.11.2015


Ответы (1)


Я думаю, что лучше всего вернуть Observable.error(new Throwable("..."))

взято из javadoc:

/**
     * Returns an Observable that invokes an {@link Observer}'s {@link Observer#onError onError} method when the
     * Observer subscribes to it.
     * <p>
     * <img width="640" height="190" src="https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/error.png" alt="">
     * <dl>
     *  <dt><b>Scheduler:</b></dt>
     *  <dd>{@code error} does not operate by default on a particular {@link Scheduler}.</dd>
     * </dl>
     * 
     * @param exception
     *            the particular Throwable to pass to {@link Observer#onError onError}
     * @param <T>
     *            the type of the items (ostensibly) emitted by the Observable
     * @return an Observable that invokes the {@link Observer}'s {@link Observer#onError onError} method when
     *         the Observer subscribes to it
     * @see <a href="http://reactivex.io/documentation/operators/empty-never-throw.html">ReactiveX operators documentation: Throw</a>
     */
person Niko Adrianus Yuwono    schedule 20.11.2015
comment
глядя на ссылку, которую вы дали, как насчет того, чтобы просто бросить Observable.empty() ? - person imin; 20.11.2015
comment
@imin Это также хорошая идея, если вы не хотите заходить в onError и обрабатывать результат. - person Niko Adrianus Yuwono; 21.11.2015