2011-09-05 43 views
1

局部結果我有兩個方法都返回的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的結果,而忽略那些拋出錯誤(或超時)的結果呢?

回答

1

我想OnErrorResumeNext應該能夠處理這種情況:

從MSDN:

繼續是正常或終止的觀察到的序列一個 異常與下一個可觀察的序列。

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

您可以通過返回的觀察到使用聚合做陣列的CONCAT。 我假設本地和網絡都是冷觀察,即只有當某人訂閱它們時纔開始生成值。

+0

看起來很有趣,雖然很容易混淆命名爲 如果拋出會發生什麼?它會傳播嗎? –

0

如何:

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

如果b拋出並且滿意? (b.Catch(empty))。然後(... –

+0

嗯,它可能不會,可能會更好地把'b'''' –