是否有一个与油门时间类似的RXJS运算符,但不忽略中间事件?

时间:2019-06-21 20:38:12

标签: rxjs rxjs6

我有以下示例代码:

interval(500).pipe(
  throttleTime(1000)
).subscribe(arg => {
  console.log(arg);
});

哪个发出:

0
3
6
...

我知道它每1000毫秒发出一次最新值。我的问题是它会忽略不是最新的值。是否有一个类似于节流时间的运算符,但是保存了这些忽略的值的运算符?我希望它发出:

[0]
[1,2,3]
[4,5,6]
...

编辑:理想情况下,我想要一种可以监听按钮点击的声音。第一次单击时,代码将启动一个计时器,持续N毫秒。用户可以在此期间继续单击。一旦N毫秒结束,操作员将触发一个数组,其中包含在这N毫秒内发生的所有事件。

非常理想,我希望计时器在用户每次单击按钮时重置。

1 个答案:

答案 0 :(得分:2)

您可以使用bufferToggle。它将按照您的要求收集值并以数组形式返回:

const click$ = fromEvent(document, 'click').pipe(
  // count emitions
  scan(acc => acc += 1, 0)
)

const timerInterval = () => timer(5000);

// buffer emitions to an array. When first click happens 'turn on' buffer
// and when timer ends turn it off. 
// throttle used to avoid turning on buffer on every click  

click$.pipe(
  bufferToggle(
    click$.pipe(throttle(timerInterval)),
    timerInterval
  ),
)
.subscribe(console.log)

但是要注意-单击间隔之间没有明确的分隔。例如,用户单击时间可能超过5秒,结果将发生两次发射。

但这更多是您要解决的体系结构任务。

DEMO