基于集合内的项目延迟

问题描述 投票:1回答:1

我想根据数组内部的项目持续时间延迟来自observable的发射并打印该持续时间值;订阅中的id?

[{id:1000},{id:2000},{id:3000},{id:4000}]
                  .map(x => of(x).pipe(delay( x.id)) )            
                     .subscribe(x=>{ console.log (x.id)});
rxjs rxjs6
1个回答
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秒内完成。

© www.soinside.com 2019 - 2024. All rights reserved.