gpt4 book ai didi

scala - 为什么head不取消订阅

转载 作者:行者123 更新时间:2023-12-01 23:55:14 25 4
gpt4 key购买 nike

假设您在 rxjava-scala-0.18.4

中有以下 Observable
@volatile var dorun = true
var subscriber: Subscriber[String] = null
val myObs = Observable { obs: Subscriber[String] =>
subscriber = obs
Subscription { println("unsubscribed"); dorun = false }
}

val sub = myObs.head.subscribe(println(_))

assertTrue(dorun)

subscriber.onNext("hello")
Thread.sleep(500)
assertFalse(dorun)

subscriber.onNext("world")
Thread.sleep(500)
assertFalse(dorun)

第二个断言失败,这意味着 head 没有退订。我对 Observables 的理解是错误的还是应该 head 在第一个元素发出后取消订阅?

最佳答案

看看你的 subscribe() 方法:你循环直到 run 被设置为 false,但唯一的方法是碰巧是关闭订阅。问题是还没有人订阅:循环阻止您返回。 head 运算符无法在第一个项目交付后终止基础订阅,因为它尚未完成订阅。因此,您只会一直循环下去。

一种解决方案是将您的循环移动到在 Schedulers.trampoline() 上安排的操作中。然后事件将在从 subscribe() 返回后的某个时间传递。

此外,在您的 subscribe() 方法中,您似乎需要将新的订阅对象添加到传入的 Subscriber 中,如下所示:

val myObs = Observable {
obs: rx.lang.scala.Subscriber[String] =>
...

obs.add(
Subscription {
dorun = false
println("unsubscribed")
}
)
}

关于scala - 为什么head不取消订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24124727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com