RXJS:聚集去抖动
我的用例如下:我得到事件,有时发生在爆发中。如果发生爆发,我只需要处理一次。去抖动做到这一点。RXJS:聚集去抖动
但是,反弹只能给我一个爆发的最后一个元素,但我需要知道突发中的所有元素才能聚合(使用flatmap)。
这可以通过定时窗口或缓冲区来完成,但是这些是固定的时间间隔,所以在突发中间可能会出现缓冲区/窗口超时,因此将突发分成两部分来处理而不是1。
所以我会想是一样的东西
.
.
event: a
.
. -> a
.
.
.
.
.
.event: b
.event: c
.event: d
.
.-> b,c,d
.
.
.
.
.event : e
.
. -> e
.
这可以通过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
我不得不做一些更改才能在RxJS 5中使用它:http://jsbin.com/pubowum/2/edit?html,js,console,output –
更新: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
不,缓冲区计数做了一些不同的事情,在我的第一篇文章中,我解释了为什么缓冲区不起作用,而且如果你用时间,数量或者两者同时缓冲,这也是一样的。简而言之:缓冲区(和每个变体)可以在爆发中间发射可观测数据。这与去抖动不同,后者只会在没有传入事件的情况下经过一段时间后才会发出。 –
你设法解决您的问题? – user3743222
@ user3743222 Matt Burnell的答案适合我。 –