【发布时间】:2021-11-23 05:24:57
【问题描述】:
我找不到足够的例子来说明如何做到这一点。
本质上,我们有一个PublishSubject,它只是一个传递;我们没有对其进行任何操作。我们相信,如果有任何错误,我们会丢弃未来的事件,因为它只是一个转发它作为订阅信号接收的值,不知道为什么会出现错误。
Assuming if it is the case(对 Q 的第二条评论),我们如何忽略主题上的任何错误并保持订阅有效?
如果没有选项,有没有办法创建一个新订阅onError 并继续收听未来的.next()?
let pubSubj = PublishSubject<String>()
let obs = pubSubj
.observeOn(ConcurrentDispatchQueueScheduler(qos: .background))
.catchError { (err) -> Observable<String> in
print("***** catchError \(err)\n")
return .never() // expecting this not to terminate the subscription
}
print("***** obs: \(obs)\n")
let dispose = obs.subscribe(onNext: { (str) in
print("***** received onNext: \(str)\n")
}, onError: { (err) in
print("***** received onErr: \(err)\n")
}, onCompleted: {
print("***** completed\n")
}, onDisposed: {
print("***** onDisposed\n")
})
pubSubj.on(.next("2"))
pubSubj.onError(RxError.overflow) //emits error and terminates
pubSubj.on(.next("3")) //is not received, how can we keep from getting disposed
输出:
***** obs: RxSwift.(unknown context at $1124f80f0).Catch<Swift.String>
***** received onNext: 2
***** catchError Arithmetic overflow occurred.
其他 Rx 实现似乎有 onErrorResumeNext,RxSwift 不支持。
但有答案指向 .catchError,但从我们的示例中,它仍然在错误后处理并且我们没有收到“3”
【问题讨论】:
-
旁注,您在其中写道“发出错误并终止”。事实并非如此。请注意,
onDisposed未被调用。通过在 catch 中返回never(),您可以确保订阅不会终止,而且它永远不会发出另一个值。 -
[system.reactive] 是一个 .NET 标签
-
谢谢@DanielT 我没有注意到区别
-
@Enigmativity 移除了标签,谢谢