我试图递归地定义一个observable,它既可以从主题中发出项目,也可以在一定时间内通过默认值,在这种情况下,我使用的是计时器的默认值零。我正在使用RxScala并开始使用以下代码:
val s = PublishSubject[Int]()
def o: Observable[Unit] = {
val timeout = Observable.timer(1 second)
Observable.amb(s, timeout)
.first
.concatMap((v) => {
println(v)
o
})
}
ComputationScheduler().createWorker.schedule {
var value = 0
def loop(): Unit = {
Thread.sleep(5000)
s.onNext(value + 1)
value += 1
loop()
}
loop()
}
o.toBlocking.last
这似乎应该可行,但输出令人困惑。每隔一个零序列包含两个而不是预期的四个。发出两个零,剩余的三秒钟过去,但没有输出。
0
0
0
0
1
0
0
2
0
0
0
0
3
0
0
4
0
0
0
0
5
0
0
6
0
0
0
0
7
0
0
8
答案 0 :(得分:0)
这个确实令人费解!所以这是一个理论:
所以,而不是序列为00001 002 00003 ...将其视为0000 1002 0000 ...
所以你可能在这里遇到两个不同的问题而且我不能在不摆弄它的情况下做很多事情,但你可以尝试的事情:
答案 1 :(得分:0)
将代码重构为以下内容会产生预期结果(在我的机器上):
object Test {
def main(args: Array[String]) {
val s = PublishSubject[Int]()
val timeout = Observable.timer(1 second)
def o: Observable[Unit] = {
Observable.amb(s, timeout).first
.concatMap((v) => {
println(v)
o
})
}
var value = 0
NewThreadScheduler().createWorker.scheduleRec {
Thread.sleep(5000)
value += 1
s.onNext(value)
}
o.toBlocking.last
}
}
注意切换到NewThreadScheduler并使用scheduleRec方法而不是手动递归调度。