javascript - 使用时间和自定义事件进行缓冲

标签 javascript buffer rxjs

我昨天开始使用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);
});

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

有一个小技巧(dummyStart)可以使用错误的specialEvent立即启动计时器。这会产生一个空缓冲区作为第一个值,该值被 skip(1) 删除。

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

相关文章:

angular - 存储 Observable 的解析值,以便在模板中多次使用

javascript - HTML Javascript 无法登录

javascript - 我需要一个示例来说明如何使用 Javascript 计时器来了解用户何时创建了新的 Facebook 事件。

javascript - 在promise中返回callback()和callback()

c++ - Boost Buffer 问题 String

c++ - `clog` 是否已缓冲?

javascript - 我如何在返回字符串中获取 Observable 值

javascript - 功能在 IE 中工作正常,但相同的功能在 mozilla 3.6 中不起作用

python - 使用 python io 从缓冲流组成行读取器

angular - 如何在 Angular 2 的不同服务中订阅可观察对象