RxJava2 一个与 2 个订阅者一起执行 http 请求的可观察链运行该请求两次



我正在尝试理解响应式编程背后的概念,目前我正在做一个JavaFX应用程序,该应用程序在http请求后加载3个随机github用户。 我创建了一个 Observable,它包装了对 github api 的调用(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)));

我期望当单击按钮时,会发出请求并且订阅者会收到 30 个元素的列表,但相反,整个可观察量链是从每个订阅者运行的。 你能帮我理解如何构建代码,以便它执行 1 个请求而不是 3 个请求吗?

每个订阅都包含任何订阅副作用,例如延迟可调用对象。我不确定 RxJava 语法,但 Rx.net 避免使用 .Publsh,它将价值多播给订阅者而不是可忽略的。

是的,我已经从 rx 阅读了有关 PublishSubject 的信息,在这种情况下可能会有所帮助。 与此同时,我采用了不同的方法,我将在此处发布。

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));

最新更新