2012-04-21 6 views
3

У меня есть два наблюдаемых: LoadLocal и LoadServer. LoadLocal загружает и возвращает элемент из локального источника, а LoadServer извлекает его с сервера. Я хочу объединить их в другую наблюдаемую: Load. Я хочу, чтобы Load получил элемент из LoadLocal, и если он равен null, я хочу вернуть элемент из LoadServer. Есть идеи, как это сделать?Объединение наблюдаемых величин

Благодаря


Подробности о реальном сценарии:

// loadLocal(id) gives me an observable that returns an asset from a local source 
Func<Guid, IObservable<IAsset>> loadLocal = Observable.ToAsync<Guid, IAsset>(id => GetLocalAsset(id)); 

var svcClient = new ServiceClient<IDataService>(); 
var svc = Observable.FromAsyncPattern<Request, Response>(svcClient.BeginInvoke, svcClient.EndInvoke); 

// calling loadServer(id) gives me an observable that returns an asset from a server 
var loadServer = id => from response in svc(new Request(id)) select response.Asset; 

// so at this point i can call loadServer(id).Subscribe() to get an asset with specified id from the server, or I can call loadLocal(id).Subscribe() to get it from local source. 
// however I want another observable that combines the two so I can do: load(id).Subscribe() that gets the asset from loadLocal(id) and if it is null it gets it from loadServer(id) 
var load = ??? 

Следующая практически дает мне желаемый результат, однако как loadLocal (идентификатор) и loadServer (идентификатор) запускаемых , Если loadLocal (id) возвращает элемент, я не хочу запускать loadServer (id).

var load = id => loadLocal(id).Zip(loadServer(id), (local, server) => local ?? server); 
+2

Вы не "получать" значения при использовании 'IObservable'. Вместо этого вы вызываете (через 'Subscribe') при создании нового значения. Я действительно не понимаю ваш вопрос, так что, возможно, вы можете предоставить более подробную информацию о своих наблюдаемых и о том, как они играют вместе? –

+0

Обновлен вопрос с подробной информацией о реальном сценарии. – Pking

+0

Я нашел решение: var load = id => от localAsset в loadLocal (id) от актива в (localAsset! = Null? Observable.Return (localAsset): loadServer (id)) select asset; – Pking

ответ

2

Как об этом:

loadLocal(id) 
    .Where(x => x != null) 
    .Concat(Observable.Defer(() => loadServer(id))) 
    .Take(1); 
+0

Спасибо, кроме решения, которое я упомянул в комментариях моего оригинального сообщения, это также работает. – Pking

1

Возможно, что-то подобное?

var load = LoadLocal.Zip(LoadServer, (local, server) => local ?? server); 
+0

Спасибо, попробовал, и он работает. Тем не менее, он по-прежнему пытается извлечь элементы с сервера (LoadServer), даже несмотря на то, что LoadLocal возвращает элементы (цель состоит в том, чтобы избежать ненужных обращений к серверу, если элемент может быть выбран локально). – Pking

+0

@Pking, на самом деле я не уверен, что понимаю, что вы пытаетесь сделать ... Комментарий Мартина правильный: вы не получаете значения из наблюдаемого. –

+0

Обновлен вопрос с подробной информацией о реальном сценарии. Очень возможно, что я подхожу к проблеме не так. «выборка» относится к работе, которую наблюдает сам. – Pking

Смежные вопросы