2015-05-27 36 views
2

你是如何做到的? RxJs對我來說仍然是個謎。RxJs - 在每次突發事件後重播所有事件

我嘗試這樣的東西:

filterChanges 
    .delay(400) 
    .replay() 
    .reduce(function(acc,x) { return acc.concat(x) }, []) 
    .subscribe(function(changes) { 
     console.log(changes); 
     ... 

或者

filterChanges.subscribe(function() { 
    filterChanges.aggregate(function(changes) { 
      ... 

我真的很丟在這裏。我想要的行爲是:某些用戶操作導致多個過濾器更改。我不想一次處理一個,但只有當更改突發完成後才能處理它們。但是當我處理它們時,我希望從流的開始處更改所有過濾器。

現在我寫了這篇文章,我意識到最好是在一陣變化之後獲得所有的濾波器,而不是所有的變化本身,所以我只需要趕上爆發的結束。我想回答這兩個問題,因爲我認爲這會幫助我更好地理解RxJs。

  1. 訂閱一連串事件的結尾。
  2. 訂閱一連串事件的結尾並捕獲流開頭的所有事件 。
+1

聽起來像想要緩衝區和掃描的組合。 Buffer將給定時間段內發生的所有操作分組,並掃描以消耗此緩衝流,並維護一個累積所有觀測值的List。 – Chris

+1

你能澄清你的意思是「過濾器更改」嗎? –

+0

我的用例是:過濾器採用簡單的屬性/值形式:所以'狀態 - >德克薩斯州'過濾器意味着排除狀態爲德克薩斯州的所有記錄。我使用與日期過濾器相同的方案,因爲我的數據中存在少量不同的日期。因此,如果用戶將開始或結束日期更改爲包含,則可以一次設置或刪除多個不同日期的過濾器。每當過濾器發生變化時,我會遍歷所有記錄設置或取消設置.hidden標誌。但是,如果用戶取消設置某些過濾器(例如,展開日期範圍),我無法取消隱藏仍被其他過濾器隱藏的記錄。 – Sigfried

回答

3

如果我理解正確,請使用buffer並結合debounce。緩衝區會給你一個在緩衝窗口期間發生的事件列表,並且debounce將定義什麼時候緩衝窗口應該關閉,這就是你如何獲得突發事件的所有事件。要從流的最開始處獲取所有事件,請從緩衝區中累積所有列表。

var hotFilterChanges = filterChanges.share(); 

hotFilterChanges 
    .buffer(hotFilterChanges.debounce(200)) 
    .scan((acc, curr) => acc.concat(curr)) 
    .subscribe(x => console.log(x)); 

我們使用.share()使Observable成爲「熱」。這是必要的,所以hotFilterChange.buffer(...)hotFilterChanges.debounce(200)引用完全相同的Observable執行。

See the JSBin

+0

謝謝!我認爲這一直是讓我困擾的「熱門」事情。我會參考我的流兩次,並得到完全不同的結果。另外,我忘了在問題中使用ReplaySubject。我想你的回答是沒有必要的。 – Sigfried

+0

不知道這對任何人都很重要,但我必須將'.scan((acc,curr)=> acc.concat(curr))'更改爲'.scan([],(acc,curr)=>。 ..)',即給它一個種子價值。沒有這一點,掃描累加器不會第一次運行,我已經在那裏放了一些我需要運行的代碼。 – Sigfried

相關問題