按时间间隔创建的Observable

时间:2016-06-05 09:42:29

标签: scala observable rx-scala

我正在查看以给定时间间隔创建的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的元素实际上包含什么?

它们是否包含一些索引? 它们是否包含创建它们的时间间隔?

2 个答案:

答案 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