流上的延迟增加了吗?

时间:2018-12-31 22:33:10

标签: rxjs observable rxjs6

我有以下内容,并且确实有效,它不断增加延迟,最终使我想要的超时。

但是因为我使用的是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毫秒的超时并出错了。

2 个答案:

答案 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))