根据集合内物品的延迟

时间:2019-04-22 03:44:49

标签: rxjs rxjs6

我想根据数组内部的项目持续时间来延迟可观察到的发射,并打印该持续时间值; id在订阅中?

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

1 个答案:

答案 0 :(得分:1)

我想您快要结束了...如果要将每个事件投影到一个新的可观察对象中,则需要使用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秒内完成。