[英]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
最多可以調用一次,並結束序列。 請參見《 觀察者設計模式最佳實踐》的以下摘錄:
提供程序調用
OnError
或IObserver<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.