0

我订阅了一个Observable使用Where谓词和ObservableExtensions.Subscribe(this, Action<T>)方法。

当订阅中抛出异常时,Action我可以看到AnonymousSafeObserver堆栈上调用了一个类,这似乎是导致Observable在订阅中的异常之后对我的底层进行处置的原因Action

这不是我所期望的行为,也不是我以前在其他订阅中看到的行为,通常异常刚刚传递给OnNext(即 observable)的调用者。

在什么情况下引入这个类/行为?

4

1 回答 1

0

您不能总是依赖它们作为从观察者中的异常一直到OnNext订阅者调用的路径。任何引入异步的东西都会打破这个链条(Delay, ObserveOn, CombineLatest, 等等)。

无论如何,如果您的观察者的OnNext处理程序抛出异常,那么 Rx 会假定您的观察者的状态已损坏。 AnonymousSafeObserver在这种情况下,仅确保观察者从可观察对象中取消订阅,以避免内存泄漏并避免继续向损坏的观察者发送更多事件,这可能弊大于利。这是一种快速失败的哲学。

我的理解是,只要您订阅一个可观察的,其中一个就会被创建。Rx 对 observables 的内部订阅不会使用这个类,因为他们已经保证他们的内部观察者实现永远不会抛出异常。但是由于他们将外部观察者(即您的观察者和我的观察者)视为不受信任,因此将它们包装在这些对象之一中。

于 2013-07-29T21:38:21.517 回答