2012-04-21 194 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(ID)和loadServer(id)獲得運行。如果loadLocal(id)返回一個元素,我不希望loadServer(id)運行。

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

當你使用'IObservable'你不 「取」 的價值觀。相反,當你創建一個新值時,你會被調用(通過'Subscribe')。我真的不明白你的問題,所以也許你可以提供一些關於你的觀察對象以及他們如何一起玩的細節? – 2012-04-21 16:25:08

+0

更新了有關真實場景的詳細信息。 – Pking 2012-04-21 16:47:07

+0

我找到了解決方案: VAR負載= ID =>從localAsset在loadLocal(ID) 從在(localAsset = NULL Observable.Return(localAsset)!?:loadServer(ID))的資產 選擇的資產; – Pking 2012-04-21 18:32:36

回答

2

如何:

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

謝謝,除了我在原始文章的評論中提到的解決方案之外,這也適用。 – Pking 2012-04-22 05:26:23

1

也許這樣的事情?

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

謝謝,試了一下,它的工作原理。但是,即使LoadLocal返回元素,它仍會嘗試從服務器(LoadServer)獲取元素(如果元素可以在本地獲取,則要避免不必要的往返服務器)。 – Pking 2012-04-21 16:02:53

+0

@Pking,實際上我不確定我明白你在做什麼...... Martin的評論是正確的:你不會從可觀察值中獲取值。 – 2012-04-21 16:39:45

+0

更新了有關真實場景的詳細信息。我很可能以錯誤的方式來解決問題。 「獲取」是指觀察者本身所做的工作。 – Pking 2012-04-21 16:51:52