我正在尝试创建一个RxJava BlockingObservable
,它将每隔X毫秒发出一个变量值,直到(condition == true)或发生超时。
下面的代码似乎接近我想要的,但它总是发出ONCE然后退出。奇怪的是,我在takeUntil()
中有一个永远不会成立的条件 - 我希望这个可观察到的是连续发射并最终超时,但它并没有。
我在这里错过了什么/做错了什么?
Observable.fromCallable(() -> getSendWindow())
.sample(10, TimeUnit.MILLISECONDS)
.timeout(30, TimeUnit.SECONDS)
.takeUntil(sendWindow -> 1==2)
.doOnError(throwable -> log.warn("Timed out waiting for send window to clear. Giving up."))
.doOnCompleted(() -> {
log.info("Send window cleared");
})
.toBlocking().forEach(sendWindow -> log.info("sendWindow={}, getSendWindow());
答案 0 :(得分:2)
.sample不会按照您的想法执行。采样率将上述Observable限制为(最多)每10秒一次。
Observable.fromCallable()
只发出一次事件,然后完成。
.sample()
等待10秒,每隔10秒发出最后一个事件(如果有的话)。因此,当您将它附加到只有一个事件的Observable时,它只会发出一个事件。然后就完成了。
你真正想要的是什么(我是.net程序员,请原谅我的外壳等)就是这样。
编辑:感谢@akanokd告诉我java使用重复事件的间隔。
Observable.interval(10, timeUnit.MILLISECONDS)
.map(x -> getSendWindow())
.takeUntil(sendWindow -> 1==2)
.doOnError(throwable -> log.warn("Timed out waiting for send window to clear. Giving up."))
.doOnCompleted(() -> {
log.info("Send window cleared");
})
.toBlocking().forEach(sendWindow -> log.info("sendWindow={}, getSendWindow());
可以使用对JAVA特定版本的API调用来编辑此答案...