1.Создайте задержку
Объедините пустую задержку для каждого элемента, который ничего не излучает и завершает только после определенного времени.
const { EMTPY, of, concat } = Rx;
const { concatMap, delay } = RxOperators;
event$.pipe(
concatMap(item => concat(of(item), EMPTY.pipe(delay(20))))
);
![enter image description here](https://i.stack.imgur.com/0ASkc.png)
2.ConcatMap к таймеру
Сопоставить каждый элемент с таймером, который начинается с данного элемента и завершается через заданный промежуток времени.Следующий элемент будет выпущен, когда таймер завершит работу.Значения, испускаемые самим таймером, игнорируются.
const { timer } = Rx;
const { concatMap, ignoreElements, startWith } = RxOperators;
event$.pipe(
concatMap(item => timer(20).pipe(ignoreElements(), startWith(item)))
);
3.Индекс с интервалом (не оптимально)
Если поток событий генерирует элементы быстрее, чем желаемая задержка, вы можете использовать zip
для генерации событий, когда интервал генерируется.
const { interval, zip } = Rx;
const { map } = RxOperators;
zip(event$, interval(20)).pipe(map(([item, i]) => item));
Этот метод не гарантирует n
секунд между каждым выдаваемым элементом при всех обстоятельствах , например, когда имеется разрыв, превышающий желаемую задержку, сопровождаемый небольшим разрывом в потоке событий.
Напримерzip
работает в вашем примере с эмиссиями в 20, 30, 50, 60 с минимальной задержкой 20.
zip
не будет отлично работать с эмиссиями в 20, 30, 65, 70 с минимальной задержкой 20.
https://rxviz.com/v/2ORZLllO