我有4种不同类型的事件,我使用Observable.fromEvent(object, 'type1')
转换为observable。它们触发的事件具有以下组合。
- 只有type1。
- type1,type2
- type1,type3
- type1,type4,
- type2,type1,type3
- type3,type4,type1
醇>
由于没有直接的模式。我使用了merge和bufferTime。如下所示抽出事件。
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
功能。
如何使用observable使得计时器在空缓冲区开始并结束x + .5s,而不是每隔0.5秒取样一次。
答案 0 :(得分:3)
您好像希望buffer
使用debounceTime
。 debounceTime
运算符执行以下操作:
仅在经过特定时间跨度而没有其他源发射后才从源Observable发出值。
换句话说,它只会在最近一次发射后发出x
秒。因此,您不会得到任何空数据排放。
您可以将此项与buffer
一起用于收集主流中的“排放”块,如下所示:
const second = 1000;
const debounced = merged.debounceTime(.5 * second);
const sampled = merged.buffer(debounced);
我实际上写了一篇关于收集按钮点击的博文,它使用了这种精确的方法(并详细介绍):http://www.vincecampanale.com/blog/2017/05/24/learn-rxjs-with-a-button/。