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

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

这是一个基本表示:

 

缓冲区A[1, 2]B[3, 4, 5]C[6, 7]D[8, 9]的内容。

时间段ABD具有相同的持续时间2000毫秒。

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

我怎样才能做到这一点 ?

最佳答案

您可以尝试这个(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)删除。

关于javascript - 带时间和自定义事件的缓冲,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37635557/

10-10 18:20
查看更多