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



我有两个方法都返回一个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应该能够处理这种情况:

从MSDN

:

继续一个可观察序列,该序列被正常终止或被下一个可观察序列异常。

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

相关内容

  • 没有找到相关文章

最新更新