Подпишитесь на Observable один раз и используйте его значение несколько раз в RxJava - PullRequest
0 голосов
/ 28 февраля 2019

Я использую flatMap в качестве индикатора, а затем должен запустить другой сетевой запрос.

  Observable<ResponseBody> secoondRequest =  firstRequest.flatMap(responseBody -> {
            return RetrofitFactory.create().setIssuingCountry(countrySetRequest1);
        });

Проблема в том, что у меня есть более одного Observable secondRequest, поэтому мой firstRequest выполняется несколько раз ... Мне нужно толькодля этого вызвать один раз для всех других наблюдаемых ..

  //This should not call firstRequest again, if it was already triggered once
Observable<ResponseBody> secoondRequest2 =  firstRequest.flatMap(responseBody -> {
            return RetrofitFactory.create().setIssuingCountry(countrySetRequest1);
        });

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Вам необходимо сохранить firstObservable в переменной и использовать share() и replay(), чтобы он выполнялся один раз (первая наблюдаемая будет подписана один раз) из нескольких источников, но его значение передается нескольким вторым наблюдаемым.

Observable<Something> firstObservable = firstRequest().share().replay()
Observable<ResponseBody> secoondRequest2 =  firstObservable.flatMap(responseBody -> {
        return RetrofitFactory.create().setIssuingCountry(countrySetRequest1);
    });
0 голосов
/ 28 февраля 2019

Не совсем понятно, каков ваш вариант использования.Поэтому я предполагаю, что у вас есть несколько запросов, которые зависят от ответа на первый запрос.То есть

request1 <- request2, request3, request4 .... Один из возможных способов решения проблемы - как показано ниже </p>

Observable<ResponseBody> firstRequest = firstRequest();

Observable<ResponseBody> finalRequest = firstRequest.flatMap(responseBody -> {
 return RetrofitFactory.create().setIssuingCountry(countrySetRequest1)
.merge(RetrofitFactory.create().setIssuingCountry(countrySetRequest1))
.merge(RetrofitFactory.create().setIssuingCountry(countrySetRequest1))
.merge(RetrofitFactory.create().setIssuingCountry(countrySetRequest1))
...
}
...