我希望创建一个订阅输入源的observable,但只保留错误消息(即忽略元素和完成消息,直到有人调用Dispose)。
基本上我正在寻找类似Observable.IgnoreElements的内容,但更像Observable.Never。
问题是IgnoreElements会留下终止消息(成功和错误)。我只想留下错误通知,并在序列成功终止时忽略。 Never方法执行此操作,但只生成一个可观察的序列,您无法从另一个序列创建它。
答案 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:
提供商调用
OnError
或IObserver<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);