На самом деле это интересный вопрос, и не удалось найти точный вопрос о SO.
Это мое решение , я написал вспомогательные методы для более легкого понимания и повторного использования кода в будущем:
Мое решение в Live редактор StackBlitz Ссылка
import { from, timer, Observable } from 'rxjs';
import {
scan,
map,
concatMap,
share,
} from 'rxjs/operators';
const timeOf = (interval: number) => <T>(val: T) =>
timer(interval).pipe(map(x => val));
const timed = (interval: number) => <T>(source: Observable<T>) =>
source.pipe(
concatMap(timeOf(1000)),
map(x => [x]),
scan((acc, val) => [...acc, ...val]),
)
И использование:
arr = [1, 2, 3, 4, 5]
arr$ = from(this.arr)
.pipe(
timed(1000),
)
Что касается HTML будет:
<div *ngFor="let i of arr$ | async">
<b>{{ i }}</b>
</div>
Как объяснение:
from(this.arr)
будет выдавать каждый из элементов массива отдельно, а затем я использую concatMap()
для каждого испускаемого элемента в timer(1000)
, что существенно задерживает каждый испускаемый элемент на 1 секунду.Наконец, я использую оператор scan()
для объединения каждого испускаемого элемента обратно в окончательный накопленный массив.