如何在 RXJS 5+ 中按时间有效地对事件进行分组
How to efficiently group events by time in RXJS 5+
我有 4 种不同类型的事件,我使用 Observable.fromEvent(object, 'type1')
转换为可观察事件。他们的事件触发有以下组合。
- only type1.
- type1, type2
- type1, type3
- type1, type4,
- type2, type1, type3
- 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
使用 debounceTime
。 debounceTime
运算符执行以下操作:
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/。
我有 4 种不同类型的事件,我使用 Observable.fromEvent(object, 'type1')
转换为可观察事件。他们的事件触发有以下组合。
- only type1.
- type1, type2
- type1, type3
- type1, type4,
- type2, type1, type3
- 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
使用 debounceTime
。 debounceTime
运算符执行以下操作:
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/。