我有两个方法都返回IObservable
IObservable<Something[]> QueryLocal();
和
IObservable<Something[]> QueryWeb();
QueryLocal总是成功的。 QueryWeb容易受到超时和可能的Web错误的影响。
我希望实现一个QueryLocalAndWeb()来调用它们并组合它们的结果。 到目前为止,我有:
IObservable<Something[]> QueryLocalAndWeb()
{
var a = QueryLocal();
var b = QueryWeb();
var plan = a.And(b).Then((x, y) => x.Concat(y).ToArray());
return Observable.When(plan).Timeout(TimeSpan.FromSeconds(10), a);
}
但是,我不确定它是否处理QueryWeb产生错误的情况。 将来我可能会有一个需要考虑的QueryWeb2()。
那么,如何组合来自多个IObservable的结果,忽略那些抛出错误(或超时)的结果?
答案 0 :(得分:1)
我猜OnErrorResumeNext
应该能够处理这种情况:
来自MSDN:
继续正常终止或由a终止的可观察序列 下一个可观察序列的异常。
IObservable<Something[]> QueryLocalAndWeb()
{
var a = QueryLocal();
var b = QueryWeb().Timeout(TimeSpan.FromSeconds(10));
return Observable.OnErrorResumeNext(b, a);
}
您可以在返回的observable上使用Aggregation来执行数组连接。 我假设本地和网络都是冷可观察的,即只有当有人订阅它们时才开始产生价值。
答案 1 :(得分:0)
怎么样:
var plan = a.And(b).Then((x, y) => x.Concat(y.Catch(Observable.Empty<Something[]>()).ToArray());