如何在 RXJS 5+ 中按时间有效地对事件进行分组

How to efficiently group events by time in RXJS 5+

我有 4 种不同类型的事件,我使用 Observable.fromEvent(object, 'type1') 转换为可观察事件。他们的事件触发有以下组合。

  1. only type1.
  2. type1, type2
  3. type1, type3
  4. type1, type4,
  5. type2, type1, type3
  6. type3, type4, type1

因为没有直接的模式。我使用了合并和缓冲时间。抽样事件如下所示。

const e1 = Observable.fromEvent(ob1, 'type1');
const e2 = Observable.fromEvent(ob1, 'type2');
const e3 = Observable.fromEvent(ob1, 'type3');
const e4 = Observable.fromEvent(ob1, 'type4');

const merged = merge(e1, e2, e3, e4);
const sampled = merged.bufferTime(500);
sampled.subscribe(e=>console.log(e));

虽然上面的代码有效,但是每隔 .5s 就会发出数据,如果没有事件,则会发出空数据。我尝试使用 buffer,但在 RXJS 5+ 中,缓冲区只有 closingselector 功能。

我如何使用 observables 使计时器从空缓冲区开始并结束 x+.5s,而不是每 .5s 采样一次。

您似乎想 buffer 使用 debounceTimedebounceTime 运算符执行以下操作:

Emits a value from the source Observable only after a particular time span has passed without another source emission.

换句话说,它只会在 最近一次发射 秒后发射 x 秒。因此,您最终不会排放任何空数据。

您可以将其与 buffer 一起使用,以收集来自主流的 "chunks" 排放量,如下所示:

const second = 1000;
const debounced = merged.debounceTime(.5 * second);
const sampled = merged.buffer(debounced);

我实际上写了一篇关于收集按钮点击次数的博客 post,它使用了这种确切的方法(并进行了更详细的介绍):http://www.vincecampanale.com/blog/2017/05/24/learn-rxjs-with-a-button/