【问题标题】:RxJava2 One Observable chain that does http request with 2 subscribers runs the request twiceRxJava2 一个与 2 个订阅者进行 http 请求的 Observable 链运行请求两次
【发布时间】:2018-06-03 16:04:28
【问题描述】:

我正在尝试理解反应式编程背后的概念,目前我正在做一个 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 个元素的列表,但相反,整个 observable 链是从每个订阅者运行的。 你能帮我理解如何构造代码,让它执行 1 个请求而不是 3 个请求吗?

【问题讨论】:

    标签: rx-java reactive-programming rx-java2 reactive reactive-streams


    【解决方案1】:

    每个订阅都包含任何订阅副作用,例如延迟可调用对象。我不确定 RxJava 语法,但在 Rx.net 中,使用 .Publsh 可以避免这种情况,它将值多播给订阅者而不是可观察的。

    【讨论】:

      【解决方案2】:

      是的,我从 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));
      

      【讨论】:

      • 这个问题是它只被触发一次:(
      猜你喜欢
      • 2019-07-14
      • 2023-03-28
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多