Rx java RXJava:Observable在订阅者请求项目之前发出项目

Rx java RXJava:Observable在订阅者请求项目之前发出项目,rx-java,observable,Rx Java,Observable,在下面的示例中,我希望我的订户最初从observable请求两个项目,然后每5秒再请求两个: public class RxJavaExample { public static void main(String[] args) { Observable.range(1, 6) .flatMap(testData -> { System.out.println("next item"); return Observable.just(tes

在下面的示例中,我希望我的订户最初从observable请求两个项目,然后每5秒再请求两个:

public class RxJavaExample {

public static void main(String[] args) {
  Observable.range(1, 6)
      .flatMap(testData -> {
        System.out.println("next item");
        return Observable.just(testData);
      }, 1)
    .toBlocking()
    .subscribe(new Subscriber<Integer>() {

      public void onStart() {
        System.out.println("requesting\n\n");
        request(2);
        Observable.interval(5, SECONDS)
            .subscribe(
                x -> {
                  System.out.println("requesting\n\n");
                  request(2);
                }); 
      }

      @Override
      public void onCompleted() {
        System.out.println("done");
      }

      @Override
      public void onError(Throwable e) {
        System.err.println(e);
      }

      @Override
      public void onNext(Integer testData) {
        System.out.println("OnNext");
      }
    });
 }
}
但这是我得到的实际输出:

  next item
  requesting


  next item
  next item
  OnNext
  OnNext
  requesting


  next item
  OnNext
  OnNext
  next item
  requesting


  next item
  OnNext
  OnNext
  done
似乎在我的订户请求任何东西之前,可观察对象仍然会发出一个项目。为什么会发生这种情况?有没有办法确保Observable只在我的订阅者请求时才发出项目


我的例子很做作,因为我可以使用
map
而不是
flatMap
,这将提供我想要的行为,但对于我的实际用例,我确实需要使用
flatMap

,这是因为
flatMap()
操作符向生产者添加了请求(source
range()
Observable)根据请求的并发级别,在您的情况下,您请求并发级别为1,因此
flatMap
将调用
request(1)
范围
Observable
,因此生产者将在订阅者请求任何内容之前生成单个项目

请注意,这里有2个缓冲区,虽然
flatMap()
在订阅服务器之前请求了项,但它只会导致range()生成项,但在
onNext()
处不会得到未请求项,这意味着onNext序列与预期一样,它只是
range()
以不同的方式生成项目


顺便说一句,在默认情况下,
flatMap()
意味着没有并发限制,它将请求无限项,在这种情况下,所有项都将立即生成,而不是像您的情况那样仅生成一项。

感谢您的解释。这似乎仍然是一种奇怪的行为。为什么不等待我的订户发出请求呢?我将并发限制设置为1的原因是,在我的实际用例中,我在
flatMap
中执行了一个异步操作,该操作每秒只能处理一定数量的项。在没有任何请求的情况下,可观察对象发出项目似乎是浪费。简言之,你是对的,这在技术上是可能的,但这种行为历史上来自RX.NET,你可以从David Karnok的博客:在背压下部分更深入地了解和更好地解释。
  next item
  requesting


  next item
  next item
  OnNext
  OnNext
  requesting


  next item
  OnNext
  OnNext
  next item
  requesting


  next item
  OnNext
  OnNext
  done