Все delay
делает то, что говорит: всякий раз, когда он получает значение, он удерживает это значение в течение периода задержки, а затем выдает его. Он делает то же самое для каждого значения, которое он получает. delay
не не меняет относительное время между элементами в потоке.
Итак, когда вы делаете from([1,2,3,4]).pipe(delay(1000))
, происходит следующее:
- Время 0:
from
испускает 1
- Время 0:
delay
видит 1 и запускает таймер1
- Время 0:
from
испускает 2
- Время 0:
delay
видит 2 и запускает таймер2
- ...
- Время 1000: таймер1 завершается и
delay
испускает 1
- Время 1000: таймер2 завершается и
delay
испускает 2
- ...
Таким образом, поскольку все 4 значения были переданы в быстрой последовательности, вы действительно видите только начальную задержку, а затем все 4 значения передаются в нисходящем направлении. В действительности каждое значение было задержано на 1 секунду с момента его первоначального выброса.
Если вы хотите «разложить» элементы так, чтобы они были на расстоянии не менее 1 секунды, то вы можете сделать что-то вроде:
const source = from([1, 2, 3, 4])
const spread = source.pipe(concatMap(value => of(value).pipe(delay(1000))));
spread.subscribe(value => console.log(value));
Это преобразует каждое отдельное значение в наблюдаемое, которое выдает значение после задержки, а затем объединяет эти наблюдаемые. Это означает, что таймер для каждого элемента не будет тикать, пока не закончится таймер предыдущего элемента.