我想根据数组内部的项目持续时间来延迟可观察到的发射,并打印该持续时间值; id在订阅中?
[{id:1000},{id:2000},{id:3000},{id:4000}]
.map(x => of(x).pipe(delay( x.id)) )
.subscribe(x=>{ console.log (x.id)});
答案 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秒内完成。