【问题标题】:How to ignore all notifications from an observable sequence except errors?如何忽略除错误之外的可观察序列中的所有通知?
【发布时间】:2015-04-14 07:30:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# system.reactive observable


    【解决方案1】:

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

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

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

    如果您想在一个序列中出现多个异常,则解决方案会涉及更多。

    IObserver&lt;T&gt; 的隐含契约是它会按照这种模式被调用:

    OnNext* [OnError|OnCompleted]
    

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

    一旦提供者调用了OnErrorIObserver&lt;T&gt;.OnCompleted 方法,就不会再有通知了。 . .

    如果你想要一个可以有多个“错误”的序列,定义如下:

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

    然后像这样使用它:

    IObservable<ITry<T>>
    

    保持IObserver&lt;T&gt;.OnError(Exception) 表示出了问题序列本身,而不是序列中的项目。

    【讨论】:

    • 对不起,我的问题可能不清楚。我不需要多个错误,我只需要按照正常语法广播任何错误。我将相应地编辑问题。
    【解决方案2】:

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

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

    【讨论】:

    • 虽然 Timothy 的方法更“资源高效”(生成的对象更少)
    【解决方案3】:

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

    给定一个名为 source 的 observable:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多