Объединение локального результата с возможным (время ожидания / ошибка) асинхронным веб-результатом - PullRequest
1 голос
/ 05 сентября 2011

У меня есть два метода, которые оба возвращают IObservable

IObservable<Something[]> QueryLocal();

и

IObservable<Something[]> QueryWeb();

QueryLocal всегда успешен.QueryWeb подвержен как тайм-ауту, так и возможным веб-ошибкам.

Я хочу реализовать 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, игнорируя те, которые выдают ошибки (или тайм-аут)?

Ответы [ 2 ]

1 голос
/ 06 сентября 2011

Я думаю, OnErrorResumeNext должен быть в состоянии справиться с этим сценарием:

Из MSDN:

Продолжает наблюдаемую последовательность, которая обычно завершаетсяисключение со следующей наблюдаемой последовательностью.

IObservable<Something[]> QueryLocalAndWeb()
{
  var a = QueryLocal();
  var b = QueryWeb().Timeout(TimeSpan.FromSeconds(10));
  return Observable.OnErrorResumeNext(b, a);
}

Конкат массива можно сделать, используя Aggregation для возвращаемой наблюдаемой.Я предполагаю, что как локальные, так и веб-ресурсы наблюдаются в холодном режиме, то есть они начинают создавать значения только тогда, когда кто-то подписывается на них.

0 голосов
/ 06 сентября 2011

Как насчет:

var plan = a.And(b).Then((x, y) => x.Concat(y.Catch(Observable.Empty<Something[]>()).ToArray());
...