val x: Observable[Int] = Observable.just(1).doOnSubscribe(() => println(s"subscribed"))
val y = x.subscribe(t => println(s"got item: $t"))
println("all done")
我原以为这段代码会打印
subscribed
got item: 1
all done
但它不打印最初的“订阅”。
val x: Observable[Int] = Observable.just(1).doOnSubscribe(() => println(s"subscribed"))
val y = x.subscribe(t => println(s"got item: $t"))
println("all done")
我原以为这段代码会打印
subscribed
got item: 1
all done
但它不打印最初的“订阅”。
的签名doOnSubscribe
是:
def doOnSubscribe(onSubscribe: => Unit): Observable[T]
也就是说,它需要一个别名参数。所以你必须按如下方式使用它:
Observable.just(1).doOnSubscribe(println(s"subscribed"))
by-name表示println
传递给 时不会执行doOnSubscribe
,而只会doOnSubscribe
使用一次。
您传递给doOnSubscribe
的是一个 0-arity 函数,即 type 的表达式() => Unit
,并且通过丢弃表达式的值,Scala 可以将任何表达式转换为 Unit,这就是它编译的原因。
恕我直言,这令人困惑,我更喜欢() => Unit
参数而不是=> Unit
,然后它会按您的预期工作。
顺便说一句:你不是第一个对此感到困惑的人;-)