События в очереди каждые 350 мс с RxJS - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть событие клавиатуры, которое вызывает воспроизведение анимации.Пользователь может генерировать больше событий, чем скорость воспроизведения анимации, поэтому я хочу создать очередь, которая в конечном итоге будет очищаться, стреляя один за другим после некоторой задержки.

Желаемая мраморная диаграмма:

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

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

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

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

user быстро запускает 3 события (a b c).После возникновения события a запускается таймер 350 мс.После окончания этого таймера result запускает a и запускает еще один таймер на 350 мс.После того, как тот таймер сделан, он запускает b.В принципе, если таймер работает, я хочу добавить его в очередь и выпустить позже.Скорость не может превышать 350 мс, и я хочу каждое событие.

Я хочу уменьшить вывод событий до 350 мс, но я не хочу использовать оператор throttle, потому что я не хочу терятьсобытия (я хочу, чтобы сработали a, b и c).

Желательно решение Javascript RxJS, но я приму любой ответ с операторами Rx на любом языке.

1 Ответ

0 голосов
/ 20 ноября 2018

Это, кажется, делает трюк:

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)

Блиц


Редактировать: Оператор concat() является избыточным.Удалены.

...