簡體   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