我有两个方法都返回一个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()也需要考虑。
那么,我如何组合来自多个IObservables的结果,忽略那些抛出错误(或超时)的结果?
我猜OnErrorResumeNext
应该能够处理这种情况:
:
继续一个可观察序列,该序列被正常终止或被下一个可观察序列异常。
IObservable<Something[]> QueryLocalAndWeb()
{
var a = QueryLocal();
var b = QueryWeb().Timeout(TimeSpan.FromSeconds(10));
return Observable.OnErrorResumeNext(b, a);
}
你可以通过在返回的可观察对象上使用Aggregation来实现数组的concat。我假设本地和web都是冷可观察的,即只有当有人订阅它们时它们才开始产生值。
如何:
var plan = a.And(b).Then((x, y) => x.Concat(y.Catch(Observable.Empty<Something[]>()).ToArray());