Rx java RXJava:Observable在订阅者请求项目之前发出项目
在下面的示例中,我希望我的订户最初从observable请求两个项目,然后每5秒再请求两个: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
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()
操作符向生产者添加了请求(sourcerange()
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