Я думаю, что вы близки ... если вы хотите проецировать каждое событие в новую наблюдаемую, тогда вам нужно использовать mergeMap
вместо map
.
import { from, of } from 'rxjs'
import { delay, mergeMap } from 'rxjs/operators'
let events = [{id:1000}, {id:2000}, {id:3000}, {id:4000}]
from(events).pipe(
mergeMap(event => of(event).pipe(
delay(event.id),
)),
).subscribe(event => { console.log(event.id) })
Но обратите вниманиечто mergeMap
будет запускать каждое событие параллельно.Для вашего очень конкретного примера это будет означать, что каждое событие будет выводиться с задержкой всего в 1 секунду.Вся наблюдаемая будет завершена в общей сложности за 4 секунды.
Если вы хотите, чтобы задержка составляла время между событиями, то вы захотите обработать каждое из них последовательно.Вы можете посмотреть на concatMap
для этого:
import { from, of } from 'rxjs'
import { delay, mergeMap } from 'rxjs/operators'
let events = [{id:1000}, {id:2000}, {id:3000}, {id:4000}]
from(events).pipe(
concatMap(event => of(event).pipe(
delay(event.id),
)),
).subscribe(event => { console.log(event.id) })
Опять же для вашего очень конкретного примера, приведенное выше будет ждать одну секунду дольше каждый раз между событиями.Это наблюдаемое завершится всего за 10 секунд.