2016-03-01 79 views
8

我的用例如下:我得到事件,有時發生在爆發中。如果發生爆發,我只需要處理一次。去抖動做到這一點。RXJS:聚集去抖動

但是,反彈只能給我一個爆發的最後一個元素,但我需要知道突發中的所有元素才能聚合(使用flatmap)。

這可以通過定時窗口或緩衝區來完成,但是這些是固定的時間間隔,所以在突發中間可能會出現緩衝區/窗口超時,因此將突發分成兩部分來處理而不是1。

所以我會想是一樣的東西

. 
. 
event: a 
. 
. -> a 
. 
. 
. 
. 
. 
.event: b 
.event: c 
.event: d 
. 
.-> b,c,d 
. 
. 
. 
. 
.event : e 
. 
. -> e 
. 
+0

你設法解決您的問題? – user3743222

+0

@ user3743222 Matt Burnell的答案適合我。 –

回答

11

這可以通過buffer在通過抖流作爲閉幕選擇來實現,例如:

var s = Rx.Observable.of('a') 
    .merge(Rx.Observable.of('b').delay(100)) 
    .merge(Rx.Observable.of('c').delay(150)) 
    .merge(Rx.Observable.of('d').delay(200)) 
    .merge(Rx.Observable.of('e').delay(300)) 
    .share() 
; 

s.buffer(s.debounce(75)).subscribe(x => console.log(x)); 

這裏有一個可運行的版本:https://jsbin.com/wusasi/edit?js,console,output

+1

我不得不做一些更改才能在RxJS 5中使用它:http://jsbin.com/pubowum/2/edit?html,js,console,output –

+0

更新:http://jsbin.com/pubowum/ 7 /編輯?JS,控制檯輸出 –

-1

你可能會從網頁尋找bufferWithTimeOrCount

/* Hitting the count buffer first */ 
var source = Rx.Observable.interval(100) 
    .bufferWithTimeOrCount(500, 3) 
    .take(3); 

var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + x.toString()); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

// => Next: 0,1,2 
// => Next: 3,4,5 
// => Next: 6,7,8 
// => Completed 
+0

不,緩衝區計數做了一些不同的事情,在我的第一篇文章中,我解釋了爲什麼緩衝區不起作用,而且如果你用時間,數量或者兩者同時緩衝,這也是一樣的。簡而言之:緩衝區(和每個變體)可以在爆發中間發射可觀測數據。這與去抖動不同,後者只會在沒有傳入事件的情況下經過一段時間後纔會發出。 –