RXJS:聚合去盎司

RXJS:聚合去盎司,rxjs,reactivex,Rxjs,Reactivex,我的用例如下:我获取事件,这些事件有时以突发方式发生。如果爆发,我只需要处理一次。Debounce就是这么做的 然而,debounce只提供了突发事件的最后一个元素,但我需要知道突发事件中的所有元素,以便对它们进行聚合(使用flatmap) 这可以由定时窗口或缓冲器来完成,但是,这些都是固定的间隔,因此缓冲区/窗口超时可能发生在突发的中间,因此分裂2个部分来处理突发而不是1个。 所以我想要的是 . . event: a . . -> a . . . . . .event: b .event

我的用例如下:我获取事件,这些事件有时以突发方式发生。如果爆发,我只需要处理一次。Debounce就是这么做的

然而,debounce只提供了突发事件的最后一个元素,但我需要知道突发事件中的所有元素,以便对它们进行聚合(使用flatmap)

这可以由定时窗口或缓冲器来完成,但是,这些都是固定的间隔,因此缓冲区/窗口超时可能发生在突发的中间,因此分裂2个部分来处理突发而不是1个。 所以我想要的是

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

你可能在找

从页面:

/* 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
这可以通过将去抖动流作为关闭选择器传入来实现,例如:

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));

这是一个可运行的版本:

不,带计数的缓冲区做了一些不同的事情,在我的第一篇文章中,我解释了为什么缓冲区不工作,如果带时间、计数或两者的缓冲区也一样。简而言之:缓冲器(和每个变体)可以在突发的中间发射可观测值。这与debounce不同,debounce只会在一段时间后才发出,没有传入事件。你解决了你的问题吗?@user3743222 Matt burnell的答案对我很有用。我必须做一些更改才能在RxJS 5中使用它:至少对于rxJava,这会每75毫秒重新发出相同的列表