使用 RxJS 每 350 毫秒触发一次队列事件

Queue events to fire every 350ms with RxJS

我有一个导致动画播放的键盘事件。用户可能会产生比动画播放速率更多的事件,因此我想创建一个队列,在一定的延迟后最终将一个一个地清空。

所需弹珠图:

=================================================

user:    START|a-b-c-----------------------------

result:  START|-350ms--a--350ms--b--350ms--c-----

=================================================

user 快速触发 3 个事件 (a b c)。事件 a 触发后,350 毫秒计时器启动。该计时器结束后,result 触发 a 并启动另一个 350 毫秒计时器。在该计时器完成后,它会触发 b。基本上,如果计时器正在进行中,我想将它添加到队列中并稍后发出。速率不能超过350ms,我要每个事件。

我想将事件的输出限制在 350 毫秒,但我不想使用 throttle 运算符,因为我不想丢失任何事件(我想要 abc 开火)。

A Javascript RxJS 解决方案是首选,但我会接受任何语言的 Rx 运算符的任何答案。

这似乎可以解决问题:

import { fromEvent, concat, timer } from 'rxjs';
import { tap, concatMap, filter } from 'rxjs/operators';

fromEvent(document, 'keypress')
.pipe(
  filter((e: KeyboardEvent) => e.code === 'Space'),
  concatMap(() => timer(350))
).subscribe(console.log)

Blitz


编辑:concat() 运算符是多余的。已删除。