将本地结果与可能的(超时/错误)异步Web结果相结合

时间:2011-09-05 19:52:46

标签: system.reactive

我有两个方法都返回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的结果,忽略那些抛出错误(或超时)的结果?

2 个答案:

答案 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());