2016-11-29 6 views
2

Мне нужно сделать около 5 запросов на цепочку, например, у меня есть 5 разных вызовов, и я хочу сделать их серийными, а не параллельными в определенном порядке.запросы на цепочку с модификацией и rxjava

Вот некоторые примеры моего наблюдаемые

Observable<ResponseBody> textsCall=EndpointFactory.provideEndpoint().getTexts(textsTask.getLanguage()) 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()); 

Observable<AirportCombo> routesCall=EndpointFactory.provideEndpoint().getRoutes() 
     .subscribeOn(Schedulers.newThread()) 
     .observeOn(AndroidSchedulers.mainThread()); 

На самом деле, я не знаю, что функция делает это на приёмном Явы.

Ранее Ive реализовал параллельные запросы, теперь мне нужен серийный номер.

Если вам нужен параллельный подход здесь вы:

Observable<ResponseResult> combined = Observable.zip(textsCall, routesCall, (textsBody, airportCombo) -> { 
      //some parsing and other logic 
      return new ResponseResult(flag); 
     }); 
+2

обычно используют 'flatMap()' на запросы цепи, как это .. особенно если результат первого вызова необходим при совершении второго вызова. –

ответ

7

Вы можете использовать функцию flatmap для этой точной цели

textsCall 
.flatMap(new Func1 < ResponseBody, Observable <AirportCombo>>() { 
    @Override 
    public Observable <AirportCombo> call(ResponseBody valueA) { 
    // code to save data from service valueA to db 
    // call service B 
    return routesCall; 
    } 
}) 
.flatMap(new Func1 < AirportCombo, Observable <ValueC>>() { 
    @Override 
    public Observable <ValueC> call(AirportCombo valueB) { 
    // code to save data from service valueB to db 
    // call service C 
    return observableC; 
    } 
}) 
.flatMap(new Func1 < ValueC, Observable <ValueD>>() { 
    @Override 
    public Observable <ValueD> call(ValueC valueC) { 
    // code to save data from service valueC to db 
    // call service D 
    return observableD; 
    } 
}) 
.flatMap(new Func1 < ValueD, Observable <ValueFinal>>() { 
    @Override 
    public Observable <ValueFinal> call(ValueD valueC) { 
    // code to save data from service valueD to db 
    // call Final Service 
    return observableFinal; 
    } 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(new Subscriber <ValueFinal>() { 
    @Override 
    public void onCompleted() {} 

    @Override 
    public void onError(Throwable e) { 

    } 

    @Override 
    public void onNext(ValueFinal fooB) { 
    // code to save data from service ValueFinal to db 

    } 
}); 
+0

спасибо, я ценю –

+0

как насчет doOnNext подхода это нормально? .doOnNext (модельA -> db.store (модельA)) .flatMap (модельA -> apiService.B()) .doOnNext (модельB -> db.store (модельB)); –

+0

любые идеи, как обрабатывать ошибки здесь? –