RXJS:聚集去抖动

问题描述:

我的用例如下:我得到事件,有时发生在爆发中。如果发生爆发,我只需要处理一次。去抖动做到这一点。RXJS:聚集去抖动

但是,反弹只能给我一个爆发的最后一个元素,但我需要知道突发中的所有元素才能聚合(使用flatmap)。

这可以通过定时窗口或缓冲区来完成,但是这些是固定的时间间隔,所以在突发中间可能会出现缓冲区/窗口超时,因此将突发分成两部分来处理而不是1。

所以我会想是一样的东西

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

你设法解决您的问题? – user3743222

+0

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

这可以通过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,控制台输出 –

你可能会从网页寻找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

不,缓冲区计数做了一些不同的事情,在我的第一篇文章中,我解释了为什么缓冲区不起作用,而且如果你用时间,数量或者两者同时缓冲,这也是一样的。简而言之:缓冲区(和每个变体)可以在爆发中间发射可观测数据。这与去抖动不同,后者只会在没有传入事件的情况下经过一段时间后才会发出。 –