RxScala Observables重播

时间:2015-06-05 02:20:57

标签: scala observable replay rx-scala

我正在尝试理解RxScala中的replay。我创建了一个这样的observable:

lazy val toyObservable : Observable[Int] = {
    val coldObservable : Observable[Int] = intPerSecond
    val hotObservable : ConnectableObservable[Int] = coldObservable.publish
    val cachedObservable = hotObservable //.replay(3)   //<<<<<<<<< ODD THING 
    cachedObservable.connect
    cachedObservable
}

其中intPerSecond每秒发出一个整数,从0开始。订阅的第一个观察者确实每秒看到一个整数。如果第二个观察者在t = 6秒加入,那么从那一点起,他们都以一秒的间隔看到匹配的流6 ... 7 ... 8 ... 9 ....这是预期的。

现在,如果我加入.replay(3),我希望当第二个观察者加入时,他会看到3456 ... 7 ... 8 ... 9,即他会立即得到3缓存中的整数,然后在生成时以每秒一次的速度接收它们。但相反,观察者现在都看不到任何东西。我的语法有错吗?

1 个答案:

答案 0 :(得分:1)

您忘了拨打hotObservable.connect。以下代码输出您想要的内容:

import rx.lang.scala._
import rx.lang.scala.observables._
import scala.concurrent.duration._
val intPerSecond = Observable.interval(1.seconds).map(_.toInt)
val coldObservable : Observable[Int] = intPerSecond
val hotObservable : ConnectableObservable[Int] = coldObservable.publish
val cachedObservable = hotObservable.replay(3)
cachedObservable.connect
hotObservable.connect
cachedObservable.foreach(i => println(s"1: $i"))
Thread.sleep(6000)
cachedObservable.foreach(i => println(s"2: $i"))