为什么此代码永远不会触发订阅块?
Observable(1, 2, 3).materialize.foldLeft(0) { (acc, tn) =>
tn match {
case OnNext(n) => { println(acc, n); acc + n }
}
}.subscribe({s => println("THIS IS NOT FIRED", s) })
这是输出:
(0,1)
(1,2)
(3,3)
答案 0 :(得分:0)
我也是斯卡拉的初学者,所以如果没有正确解释,请耐心等待
您似乎错过了onCompleted
案例:
尝试使用:
Observable(1, 2, 3).materialize.foldLeft(0) { (acc, tn) =>
tn match {
case Notification.OnNext(n) => { println(acc, n); acc + n }
case Notification.OnCompleted() => acc
}
}.subscribe({s => println("THIS IS NOW FIRED", s) })
但是,因为从foldLeft返回的值基本上是一个(总和),如果我们按如下方式重写它,它会变得更具可读性:
val sum = Observable(1, 2, 3).materialize.foldLeft(0) { (acc, tn) =>
tn match {
case Notification.OnNext(n) => { println(acc, n); acc + n }
case Notification.OnCompleted() => acc
}
}.toBlockingObservable.single
println(sum) // prints 6
毋庸置疑,以前的解决方案只适用于流中没有元素引发错误的情况。
我发现this link非常有助于理解Observables。