我是RxScala Observables的新手,并且在组合使用take(n)和doOnCompleted()时遇到奇怪的行为。

下面我有一个测试示例,我认为第一个订阅是正确的(开始时使用take(2)),并输出订阅,下一个,完成和取消订阅方法的所有日志,但是输出第二个测试(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()不会被解雇。观察者链实际上已取消。

关于scala - RxScala doOnCompleted在调用.take()后不触发,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50045438/

10-09 02:53