我有以下内容,并且确实有效,它不断增加延迟,最终使我想要的超时。
但是因为我使用的是Concatmap,所以我从间隔中丢失了原始值。
let x = 1
let source2$ = interval(500)
.pipe(
concatMap(() => {
x++
let newtime = x * 500
console.log("newtime ", newtime)
return of(5).pipe(delay(newtime))
}),
timeout(3000),
map((data) => {
return 'Source 2: ' + data
})
)
所以它打印源2:5 ..在我希望它打印间隔值的地方。
我使用concatmap运行了我想要的东西,但是我认为它是错误的运算符,因为我失去了原始值。
有人可以帮忙吗?
更多信息
总而言之,我要做的就是使用时间间隔来发射值,并且每次发射后都会增加延迟时间-最终达到3000毫秒的超时并出错了。
答案 0 :(得分:1)
我在评论中提到,您可以使用concatMap
来接收interval
不断增加的索引:
concatMap(index => {
let newtime = index * 500
console.log("newtime ", newtime)
return of(index).pipe(delay(newtime))
}),
请注意,我正在通过of(index)
将值返回到流中。
我想我知道您担心要返回另一个Observable。由于您要顺序发射项目(仅在前一个项目完成后才发射项目),因此必须将concatMap
与另一个内部Observable一起使用。仅此功能没有特殊的运算符,因为这是“可组合的行为”,这意味着您可以通过组合现有的运算符来实现此行为。
答案 1 :(得分:0)
const source2$ = interval(500)
.pipe(
map(x => x * 500),
switchMap(x => timer(x)),
timeout(3000),
map(data => 'Source 2: ' + data)
)
更新: https://stackblitz.com/edit/rxjs-iywcm6?devtoolsheight=60
const source2$ = interval(500)
.pipe(
tap(x => console.log('Tick before delay', x)),
concatMap(x => timer((x + 1) * 500).pipe(mapTo(x))),
tap(x => console.log('Tick after delay', x)),
map(data => 'Source 2: ' + data),
timeout(3000)
).subscribe(
(data) => console.log(data),
e => console.error('Timeout', e))