2011-08-05 30 views
0

我想訂閱一個observable,但只運行一次操作,直到發生不同的IObservable爲止。每當其他IObservable觸發時,我想重新訂閱並運行一次。下面的代碼應該完成:每次發生另一個事件時使用反應式重新訂閱

Action<object> act = null; 
act = _ => { 
    DoThis(); 
    obj.Observable1.SkipUntil(obj.CompletedObservable).Take(1).Subscribe(act); 
}; 
obj.Observable1.Take(1).Subscribe(act); 

是否有一個更正確的方法來與Rx框架做到這一點?如果不是,我怎麼能把這個模式包裝成擴展名?

回答

1

我想我知道了:

obj 
    .CompletedObservable 
    .StartWith(/* value of suitable type for CompletedObservable */) 
    .Select(x => obj.Observable1.Take(1)) 
    .Switch() 
    .Subscribe(x => DoThis()); 
+0

完美的解決方案 - 我喜歡CompletedObservable在這裏駕駛...... –

+0

StartWith使這是一個完美的解決方案。謝謝! – TomZ

0

你有沒有試過如下:

obj.CompletedObservable 
    .Select(_ => obj.Observable1.Next().First()) 
    .Subscribe(_ => DoThis()); 
+0

請注意,您似乎沒有使用任何可觀察元素 - 在這種情況下,也許.zip ping兩個集合都會這樣做,除非Observable1很少觸發並且您想等待下一個元素。 –

+0

不幸的是,必須在CompletedObservable觸發之前處理Observable1。 – TomZ

2

看來你想是這樣的:

first -----1------------2-------------3--4---------> 
      |   |    | | 
second ---------A--B----------C-D-E-----------F---G-> 
       |    |    | 
final ---------A-------------C---------------F----- > 

對於本,SelectMany,TakeTakeUntil的組合應該工作。我會說:

var final = from f in first 
      from s in second.Take(1).TakeUntil(first) 
      select s; 

.Take(1)確保您只能獲得第一後的第一個項目(1,2和4)。該.TakeUntil(first)涵蓋3,所以F只能通過一次(至4)。如果你對這個操作有個很好的名字,那麼把這兩個觀測值作爲參數的方法很容易。

+0

好的解決方案。該圖是我應該包括的東西。 – TomZ

相關問題