内置的行为Merge运算符完成时both来源已完成。我正在寻找这个运算符的一个变体,它产生一个可观察的结果,当any两个源可观察量的完成。例如,如果第一个可观察的成功完成并且later第二个可观察的结果有一个异常,我希望忽略这个异常。
我想出了一个实现,它将一个特殊的哨兵异常连接到两个可枚举值,然后合并的序列捕获并抑制该异常。我想知道我是否缺少一个更简单的解决方案。
/// <summary>
/// Merges elements from two observable sequences into a single observable sequence,
/// that completes as soon as any of the source observable sequences completes.
/// </summary>
public static IObservable<T> MergeUntilAnyCompletes<T>(this IObservable<T> first,
IObservable<T> second)
{
var sentinel = new Exception();
first = first.Concat(Observable.Throw<T>(sentinel));
second = second.Concat(Observable.Throw<T>(sentinel));
// Concat: Concatenates the second observable sequence to the first
// observable sequence upon successful termination of the first.
return first.Merge(second)
.Catch(handler: (Exception ex) =>
ex == sentinel ? Observable.Empty<T>() : Observable.Throw<T>(ex));
// Catch: Continues an observable sequence that is terminated by an exception
// of the specified type with the observable sequence produced by the handler.
}
有趣的黑客:
public static IObservable<T> MergeUntilAnyCompletes<T>(this IObservable<T> first,
IObservable<T> second)
{
return Observable.Merge(
first.Materialize(),
second.Materialize()
).Dematerialize();
}
Materialize
将可观察量转换为通知的可观察量,因此Merge
将不再压制OnCompleted
通知。当你Dematerialize
,那么该操作员将看到OnCompleted
并停止。
旁注:如果你想要一些有趣的、略带学术性的阅读Materialize
/Dematerialize
read 这篇博文。他正在写关于 Ix 的文章,但同样的事情也适用于 Rx。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)