javascript - 使用 RxJS 将事件排队,每 350 毫秒触发一次

标签 javascript rxjs reactivex

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

所需的大理石图:

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

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

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

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

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

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

首选 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() 运算符是多余的。已删除。

关于javascript - 使用 RxJS 将事件排队,每 350 毫秒触发一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53400127/

相关文章:

javascript - 如何从填充的字段中删除 key ?

javascript - 如何对 MultiLineString 进行排序?

angular - 捕获错误后如何忽略错误并在rxjs forkJoin中执行最终结果?

javascript - 草稿状态/在 Angular 2 中保存时发布更改

angular - @ngrx/effects API 请求处理

javascript - 从另一个 iframe 中的链接在 iframe 中加载页面

javascript - NodeJs 语法错误 : Unexpected identifier

java - 在 Java 6 中创建没有 lambda 表达式的 ReactiveX observable

angular - 在rxjs中取消http订阅

java - Rx 运算符。忽略直到发出下一个