Когда внешний поток отправит значение, delayWhen отправит значение внутреннего потока.
delayWhen<T>(delayDurationSelector: (value: T, index: number) => Observable<any>, subscriptionDelay?: Observable<any>): MonoTypeOperatorFunction<T>
Это похоже на delay, но временной промежуток длительности задержки определяется вторым потоком.
delayWhen
сдвигает время каждое отправленное потоком значение на временной промежуток, определённый другим потоком. Когда источник отправляет значение, вызывается функция delayDurationSelector
со значением источника в качестве аргумента и должна возвращать значение потока, называемое "длительность" ("duration") потока. Значение источника отправляется на выводе потока только в том случае, если параметр потока отправляет значение или завершает период времени. Завершение работы нотификатора, вызывающего отправку исходного значения, является недействительным явлением и в последующих версиях будет удалено.
Опционально, delayWhen
принимает второй аргумент, subscriptionDelay
, которая является потоком. Когда subscriptionDelay
отправляет своё первое значение или завершается, источник потока подписывается и начинает вести себя так, как описано в предыдущей строке. Если subscriptionDelay
не предоставляется, delayWhen
подписывается на источник потока, как только выходные данные потока подписываются.
Название | Описание |
---|---|
delayDurationSelector | Функция, которая возвращает значение потока для каждого значения, отправленного потоком, которое затем используется для задержки выдачи этого элемента на выходе потока до тех пор, пока объект поток, возвращаемый из этой функции, не отправит значение. |
subscriptionDelay | Опционально. По умл.: undefined .Поток, который вызывает подписку на источник потока, как только он отправляет любое значение. |
Задержка каждого клика на случайное количество времени, от 0 до 5 секунд.
import { fromEvent, interval } from 'rxjs';
import { delayWhen } from 'rxjs/operators';
const clicks = fromEvent(document, 'click');
const delayedClicks = clicks.pipe(
delayWhen(event => interval(Math.random() * 5000)),
);
delayedClicks.subscribe(x => console.log(x));
- 📰 Официальная документация: delayWhen
- 📁 Исходный код: https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/pipeable/delayWhen.ts