缓冲时间和自定义事件

时间:2016-06-04 22:18:08

标签: javascript buffer rxjs

我昨天开始使用rxjs。我想实现以下行为:

我希望我的缓冲区能够同时生成时间和自定义事件。 想象一下,我的缓冲区每生成2000毫秒(就像标准bufferWithTime函数行为一样),对于某些特殊事件,会产生一个缓冲区并重新初始化计时器。

这是一个基本的表示:

缓冲区内容A[1, 2]B[3, 4, 5]C[6, 7]D:{{ 1}}。

时间段[8, 9]AB的持续时间相同,为2000毫秒。

时间段D较短,因为触发了特殊事件C并产生了缓冲区。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

你可以试试这个(jsfiddle)吗?

// Helper functions
function randomDelay(bottom, top) {
  return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
}

// Simulation of random sequence
var source$ = Rx.Observable
  .range(1, 30)
  .concatMap(function (x) {
    return Rx.Observable.of(x).delay(randomDelay(10,500));
  });

var intervalBetween = 1000; // should be 2000ms in your case
var dummyStart$ = Rx.Observable.return({});
var specialEvent$ = Rx.Observable.fromEvent(document, 'click');
var opening$ = dummyStart$.concat(specialEvent$).flatMapLatest(function(x){return Rx.Observable.timer(0, intervalBetween)});
var buffers$ = source$.buffer(opening$).skip(1);

source$.subscribe(function(x){console.log('source', x)})

buffers$.subscribe(function(buffer){
   console.log('buffer', buffer);
});

这里的想法是使用buffer运算符和签名Rx.Observable.prototype.window(windowBoundaries);。这应该为您提供非重叠的缓冲区,它们与windowBoundaries信号同步发送。

有一个小技巧(dummyStart)立即用假specialEvent启动计时器。这会产生一个空缓冲区作为第一个值,由skip(1)删除。