繁体   English   中英

如何忽略可观察序列中除错误以外的所有通知?

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

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

基本上,我正在寻找类似Observable.IgnoreElements的东西,但它将更像Observable.Never

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

如果您想要的是忽略除单个例外之外的所有更新(如果发生),则可以执行以下操作:

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最多可以调用一次,并结束序列。 请参见《 观察者设计模式最佳实践》的以下摘录:

提供程序调用OnErrorIObserver<T>.OnCompleted方法后,就不应再有其他通知了。

如果要具有可以包含多个“错误”的序列,请定义以下内容:

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

然后像这样使用它:

IObservable<ITry<T>>

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

事实证明,有一个明显的解决方案……只需将其连接到Never,就像这样:

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

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

给定一个可观察的命名source

source.Materialize().Where(x => x.Kind == NotificationKind.OnError);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM