Задержка в зависимости от элемента внутри коллекции - PullRequest
1 голос
/ 22 апреля 2019

Я хочу отложить излучение из наблюдаемого на основе длительности элемента из массива и вывести это значение продолжительности; идентификатор в подписке?

[{id:1000},{id:2000},{id:3000},{id:4000}]
                  .map(x => of(x).pipe(delay( x.id)) )            
                     .subscribe(x=>{ console.log (x.id)});

1 Ответ

1 голос
/ 22 апреля 2019

Я думаю, что вы близки ... если вы хотите проецировать каждое событие в новую наблюдаемую, тогда вам нужно использовать 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 секунд.

...