我正在查看以给定时间间隔创建的RxScala observable:
val periodic: Observable[Long] = Observable.interval(100 millis)
periodic.foreach(x => println(x))
如果我把它放在工作表中,我会得到这个结果:
periodic: rx.lang.scala.Observable[Long] = rx.lang.scala.JavaConversions$$anon$2@2cce3493
res0: Unit = ()
这让我感到困惑:periodic
的元素实际上包含什么?
它们是否包含一些索引? 它们是否包含创建它们的时间间隔?
答案 0 :(得分:2)
您可以在此处阅读http://reactivex.io/documentation/operators/interval.html生成的元素的Long
值从0
开始递增。
至于你的代码和结果:
在这里,您创建了observable,并将Observable[Long]
分配给periodic
。一切都如预期的那样。
scala> val periodic: Observable[Long] = Observable.interval(100 millis)
periodic: rx.lang.scala.Observable[Long] = rx.lang.scala.JavaConversions$$anon$2@2cce3493
在这里,您注册了一个回调,即当值被设置时会发生什么。 foreach
方法的返回类型为Unit
,因为它没有合理的值,只是因为注册回调的副作用而发生。
periodic.foreach(x => println(x))
res0: Unit = ()
您不会看到实际值,因为执行会停止。尝试插入Thread.sleep
。
val periodic: Observable[Long] = Observable.interval(100.millis)
periodic.foreach(x => println(x))
Thread.sleep(1000)
提供类似于
的输出periodic: rx.lang.scala.Observable[Long] = rx.lang.scala.JavaConversions$$anon$2@207cb62f
res0: Unit = ()
0
1
2
3
4
5
6
7
8
9
res1: Unit = ()
答案 1 :(得分:1)
问题是间隔是异步的,所以你不等待结果。
等待结果的另一种方法是使用TestSubscriber
def interval(): Unit = {
addHeader("Interval observable")
Observable.interval(createDuration(100))
.map(n => "New item emitted:" + n)
.doOnNext(s => print("\n" + s))
.subscribe();
new TestSubscriber[Subscription].awaitTerminalEvent(1000, TimeUnit.MILLISECONDS);
}
您可以在此处查看更多示例https://github.com/politrons/reactiveScala