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

时间:2015-04-13 22:05:16

标签: c# system.reactive observable

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

基本上我正在寻找类似Observable.IgnoreElements的内容,但更像Observable.Never

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

3 个答案:

答案 0 :(得分:3)

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

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

  

提供商调用OnErrorIObserver<T>.OnCompleted方法后,应该没有其他通知。 。

如果你想要一个可能有多个&#34;错误的序列,&#34;定义这样的东西:

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

然后像这样使用它:

IObservable<ITry<T>>

保持IObserver<T>.OnError(Exception)意味着错误与序列本身,而不是序列中的项目。

答案 1 :(得分:2)

原来有一个明显的解决方案......简单地连接到Never,就像这样:

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

答案 2 :(得分:1)

如果我理解你的问题,那么我认为这会有效。

给出一个名为source的可观察对象:

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