如何在RXJS 5 +

时间:2018-02-07 18:23:54

标签: typescript rxjs rxjs5

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

  
      
  1. 只有type1。
  2.   
  3. type1,type2
  4.   
  5. type1,type3
  6.   
  7. type1,type4,
  8.   
  9. type2,type1,type3
  10.   
  11. type3,type4,type1
  12.   

由于没有直接的模式。我使用了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秒取样一次。

1 个答案:

答案 0 :(得分:3)

您好像希望buffer使用debounceTimedebounceTime运算符执行以下操作:

  

仅在经过特定时间跨度而没有其他源发射后才从源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/