我想根据数组内部的项目持续时间延迟来自observable的发射并打印该持续时间值;订阅中的id?
[{id:1000},{id:2000},{id:3000},{id:4000}]
.map(x => of(x).pipe(delay( x.id)) )
.subscribe(x=>{ console.log (x.id)});
我认为你很接近......如果你想将每个事件投射到一个新的可观测量中,那么你需要使用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秒内完成。