оператор задержки
Оператор задержки используется для задержки эмиссии на заданный период времени.
Мы можем задержать эмиссию двумя типами значений.
- Время задержки в миллисекундах
- Задержка до указанной даты
const source$ = of(2,1,4).pipe( delay(3000) ); source$.subscribe(console.log); //prints 2 1 4 but after 3 seconds
Он подождет 3 секунды и напечатает, после чего начнется эмиссия. Обратите внимание, что он не будет ждать 3 секунды для каждого выпуска значения
Из приведенных выше мраморных диаграмм видно, что значения, проходящие через оператор задержки, задерживаются.
Обратите внимание на разницу между диаграммами, расстояние между первым и вторым излучаемыми значениями. Хорошо видно, что на обеих диаграммах эмиссия второго и третьего значений не изменилась.
Другими словами, оператор задержки будет задерживать поток, чтобы начать излучать, он не будет применять задержку к каждому излучению.
Задержка по дате
Вместо предоставления миллисекунд мы можем предоставить объект Date для задержки до этой даты.
const source$ = of(2,1,4).pipe( delay(new Date(2021, 11, 9, 15, 45, 0, 0))); source$.subscribe(console.log); //prints 2 1 4 at Dec 9th 2021, 3:45PM
оператор задержки при срабатывании
Оператор delayWhen будет задерживать эмиссию до тех пор, пока не будет сообщено другим наблюдаемым, вместо ожидания заранее определенного времени.
const timer$ = timer(3000); // emits after 3 seconds const source$ = of(2, 1, 4) .pipe( delayWhen(() => timer$) ); source$.subscribe(console.log); //prints 2 1 4 but after 3 seconds
Как вы видите, приведенный выше пример начинает выдавать значения через 3 секунды, но вместо того, чтобы предоставлять их как 3 секунды, мы позволили наблюдаемому таймеру определить, до какого момента его нужно отложить. Давайте посмотрим сценарий в реальном времени.
//html // <button id="submit">submit</button> const buttonSubmit = document.querySelector('#submit'); const buttonClick$ = fromEvent(buttonSubmit, 'click'); const source$ = of(2, 1, 4) .pipe( delayWhen(() => buttonClick$) ); source$.subscribe(console.log); //prints 2 1 4 after submit button clicked
Как видите, исходный наблюдаемый объект ждал, пока наблюдаемый объект buttonClick не выдаст значение. Таким образом, при нажатии кнопки отправки исходный наблюдаемый объект начал выдавать значения.
Сводка
И задержка, и задержка при задержке начала эмиссии.
задержка — задержит начало эмиссии на заданную дату и время или на миллисекунды
delayWhen — Задерживает эмиссию до тех пор, пока другая зависимая наблюдаемая не выдаст значение.