如何忽略来自可观察序列的所有通知(错误除外)?

How to ignore all notifications from an observable sequence except errors?

我希望创建一个订阅输入源但仅保留错误消息的可观察对象(即忽略元素和完成消息,直到有人调用 Dispose)。

基本上我在寻找类似 Observable.IgnoreElements but that would work more like Observable.Never 的东西。

问题是 IgnoreElements 留下了两个终止消息(成功和错误)。我只想留下错误通知并在序列成功终止时忽略。 Never 方法执行此操作,但仅生成一个可观察序列,您不能从另一个序列创建它。

原来有一个明显的解决方案...只需连接到 Never,如下所示:

IObservable<TSource> Never<TSource>(IObservable<TSource> source)
{
    return source.IgnoreElements().Concat(Observable.Never<TSource>());
}

如果您想要忽略除 单个 异常之外的所有更新,如果它发生,那么您可以这样做:

public static IObservable<T> OnlyError<T>(this IObservable<T> source)
{
    return Observable.Create<T>(
        observer => source.Subscribe(
            value => { },
            observer.OnError));
}

(由于问题已更改,其余答案不再相关。)

如果你想在单个序列中有多个个异常,解决方案就有点复杂了。

IObserver<T> 的隐式约定是将根据此模式调用它:

OnNext* [OnError|OnCompleted]

OnError最多调用一次,结束序列。请参阅 Observer Design Pattern Best Practices 中的以下摘录:

Once the provider calls the OnError or IObserver<T>.OnCompleted method, there should be no further notifications, . . .

如果你想要一个可以有多个"errors,"的序列,定义如下:

interface ITry<T>
{
    bool HasValue { get; }
    T Value { get; }
    Exception Error { get; }
}

然后像这样使用它:

IObservable<ITry<T>>

保持 IObserver<T>.OnError(Exception) 表示出现问题 序列本身 ,而不是序列中的项目。

如果我理解你的问题,那么我认为这会起作用。

给定一个名为 source:

的可观察对象
source.Materialize().Where(x => x.Kind == NotificationKind.OnError);