RxScala doOnCompleted 在调用 .take() 后没有触发
RxScala doOnCompleted not firing after call to .take()
我是 RxScala Observables 的新手,在结合使用 take(n) 和 doOnCompleted() 时遇到奇怪的行为。
下面我有一个测试示例,我认为第一个订阅是正确的(开始时使用 take(2))并输出订阅、下一步、完成和取消订阅方法的所有日志,但是第二个测试(doOnComplete 之后的 take(2))永远不会到达 doOnCompleted 方法。
import rx.lang.scala.Observable
object Tester extends App {
val obs = Observable.from(List(1,2,3,4))
val obsAddMethodsCorrect = obs.take(2)
.doOnSubscribe( println("subscribe") )
.doOnNext( n => println(s"next $n") )
.doOnError( e => println("error") )
.doOnCompleted( println("completed") )
.doOnUnsubscribe( println("unsubscribe") )
val obsAddMethodsInCorrect = obs
.doOnError( e => println("error") )
.doOnCompleted( println("completed") )
.take(2)
.doOnNext( n => println(s"next $n") )
.doOnUnsubscribe( println("unsubscribe") )
.doOnSubscribe( println("subscribe") )
obsAddMethodsCorrect.toBlocking.subscribe()
println("")
println("The above seems correct. Below seems incorrect")
println("")
obsAddMethodsInCorrect.toBlocking.subscribe()
}
上面测试的当前输出如下。
subscribe
next 1
next 2
completed
unsubscribe
The above seems correct. Below seems incorrect
subscribe
next 1
next 2
unsubscribe
为什么在第二个示例中没有触发 doOnCompleted()?
doOnCompleted()
运算符将在触发 onCompleted()
事件时调用其操作。但是,当您在观察者完成发射项目之前取消订阅时,onCompleted()
不会被触发。观察者链被有效取消
我是 RxScala Observables 的新手,在结合使用 take(n) 和 doOnCompleted() 时遇到奇怪的行为。
下面我有一个测试示例,我认为第一个订阅是正确的(开始时使用 take(2))并输出订阅、下一步、完成和取消订阅方法的所有日志,但是第二个测试(doOnComplete 之后的 take(2))永远不会到达 doOnCompleted 方法。
import rx.lang.scala.Observable
object Tester extends App {
val obs = Observable.from(List(1,2,3,4))
val obsAddMethodsCorrect = obs.take(2)
.doOnSubscribe( println("subscribe") )
.doOnNext( n => println(s"next $n") )
.doOnError( e => println("error") )
.doOnCompleted( println("completed") )
.doOnUnsubscribe( println("unsubscribe") )
val obsAddMethodsInCorrect = obs
.doOnError( e => println("error") )
.doOnCompleted( println("completed") )
.take(2)
.doOnNext( n => println(s"next $n") )
.doOnUnsubscribe( println("unsubscribe") )
.doOnSubscribe( println("subscribe") )
obsAddMethodsCorrect.toBlocking.subscribe()
println("")
println("The above seems correct. Below seems incorrect")
println("")
obsAddMethodsInCorrect.toBlocking.subscribe()
}
上面测试的当前输出如下。
subscribe
next 1
next 2
completed
unsubscribe
The above seems correct. Below seems incorrect
subscribe
next 1
next 2
unsubscribe
为什么在第二个示例中没有触发 doOnCompleted()?
doOnCompleted()
运算符将在触发 onCompleted()
事件时调用其操作。但是,当您在观察者完成发射项目之前取消订阅时,onCompleted()
不会被触发。观察者链被有效取消