如何忽略来自可观察序列的所有通知(错误除外)?
How to ignore all notifications from an observable sequence except errors?
我希望创建一个订阅输入源但仅保留错误消息的可观察对象(即忽略元素和完成消息,直到有人调用 Dispose)。
基本上我在寻找类似 Observable.IgnoreElements but that would work more like Observable.Never 的东西。
问题是 IgnoreElements 留下了两个终止消息(成功和错误)。我只想留下错误通知并在序列成功终止时忽略。 Never 方法执行此操作,但仅生成一个可观察序列,您不能从另一个序列创建它。
原来有一个明显的解决方案...只需连接到 Never,如下所示:
IObservable<TSource> Never<TSource>(IObservable<TSource> source)
{
return source.IgnoreElements().Concat(Observable.Never<TSource>());
}
如果您想要忽略除 单个 异常之外的所有更新,如果它发生,那么您可以这样做:
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 中的以下摘录:
Once the provider calls the OnError
or IObserver<T>.OnCompleted
method, there should be no further notifications, . . .
如果你想要一个可以有多个"errors,"的序列,定义如下:
interface ITry<T>
{
bool HasValue { get; }
T Value { get; }
Exception Error { get; }
}
然后像这样使用它:
IObservable<ITry<T>>
保持 IObserver<T>.OnError(Exception)
表示出现问题 序列本身 ,而不是序列中的项目。
如果我理解你的问题,那么我认为这会起作用。
给定一个名为 source
:
的可观察对象
source.Materialize().Where(x => x.Kind == NotificationKind.OnError);
我希望创建一个订阅输入源但仅保留错误消息的可观察对象(即忽略元素和完成消息,直到有人调用 Dispose)。
基本上我在寻找类似 Observable.IgnoreElements but that would work more like Observable.Never 的东西。
问题是 IgnoreElements 留下了两个终止消息(成功和错误)。我只想留下错误通知并在序列成功终止时忽略。 Never 方法执行此操作,但仅生成一个可观察序列,您不能从另一个序列创建它。
原来有一个明显的解决方案...只需连接到 Never,如下所示:
IObservable<TSource> Never<TSource>(IObservable<TSource> source)
{
return source.IgnoreElements().Concat(Observable.Never<TSource>());
}
如果您想要忽略除 单个 异常之外的所有更新,如果它发生,那么您可以这样做:
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 中的以下摘录:
Once the provider calls the
OnError
orIObserver<T>.OnCompleted
method, there should be no further notifications, . . .
如果你想要一个可以有多个"errors,"的序列,定义如下:
interface ITry<T>
{
bool HasValue { get; }
T Value { get; }
Exception Error { get; }
}
然后像这样使用它:
IObservable<ITry<T>>
保持 IObserver<T>.OnError(Exception)
表示出现问题 序列本身 ,而不是序列中的项目。
如果我理解你的问题,那么我认为这会起作用。
给定一个名为 source
:
source.Materialize().Where(x => x.Kind == NotificationKind.OnError);