RxJava2 Одна цепочка Observable, которая выполняет http-запрос с 2 подписчиками, выполняет запрос дважды - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь понять концепции, лежащие в основе реактивного программирования, и в настоящее время я делаю приложение JavaFX, которое загружает 3 случайных пользователей GitHub после запроса http.Я создал Observable, который переносит вызов к API github (API возвращает список из 30 элементов), и из ответа я хочу извлечь первые 3 элемента, чтобы разместить их на странице.

 Observable<List<GitHubUser>> loadButtonObservable = JavaFxObservable
            .actionEventsOf(runButton)
            .flatMap(ae -> 
              Observable.fromCallable(() ->
                githubExternalService.getUsersSince(
                  new Random().nextInt(500))));

 loadButtonObservable
   .take(1)
   .map(list -> list.get(0))
   .subscribe(i -> userOneVBox.getChildren().add(createText(i)));
 loadButtonObservable
   .skip(1)
   .take(1)
   .map(list -> list.get(0))
   .subscribe(i -> userTwoVBox.getChildren().add(createText(i)));
 loadButtonObservable
   .skip(2)
   .take(1)
   .map(list -> list.get(0))
   .subscribe(i -> userThreeVBox.getChildren().add(createText(i)));

Iожидалось, что при нажатии кнопки запрос будет выполнен, и подписчики получат список из 30 элементов, но вместо этого вся цепочка наблюдаемых будет запущена от каждого подписчика.Не могли бы вы помочь мне понять, как структурировать код, чтобы он выполнял 1 запрос вместо 3?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Да, я читал об PublishSubject от rx, и это может помочь в этом случае.Тем временем я пришел с другим подходом, и я опубликую это здесь.Любой обзор кода приветствуется.

JavaFxObservable.actionEventsOf(loadUsersButton)
                .flatMap(ae -> Subject.fromCallable(() -> githubExternalService.getUsersSince(new Random().nextInt(500))))
                .flatMapIterable(x -> x)
                .take(3)
                .map(this::createText)
                .map(text -> {
                    VBox vBox = new VBox();
                    vBox.getChildren().add(text);
                    return vBox;
                }).subscribe(vbox -> githubInfo.getChildren().add(vbox));
0 голосов
/ 03 июня 2018

Каждая подписка включает в себя любые побочные эффекты подписки, такие как отсрочка вызова.Я не уверен насчет синтаксиса RxJava, но в Rx.net этого избегают, используя .Publsh, который многоадресно передает значение подписчикам, а не видимому.

...