【问题标题】:Increasing delay over a stream?增加流的延迟?
【发布时间】:2018-12-31 22:33:10
【问题描述】:

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

但是因为我使用的是 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
        })
      )

所以它打印 Source 2: 5.. 我希望它打印间隔的值。

我使用 concatmap 完成了我想要的工作,但我认为它是错误的运算符,因为我失去了原始值。

有人可以帮忙吗?

更多信息

总而言之,我想做的就是使用间隔发出值,并在每次发出后增加延迟时间 - 最终达到 3000 毫秒的超时并出错。

【问题讨论】:

  • concatMap 接收触发其投影功能的值,例如concatMap(value => {}),因此如果您要问的话,您可以稍后value
  • 是的,我想这会奏效。是否有其他类型的运算符可以让我运行延迟但不返回另一个 observable。我想我有点错误地让它工作了,但我不能停止感觉我做错了
  • 我想我不明白你想做什么
  • 我更新了消息,总结了我正在尝试做的事情

标签: rxjs observable rxjs6


【解决方案1】:

我在 cmets 中提到,您可以使用 concatMap 来接收来自 interval 的不断增加的索引:

concatMap(index => {
  let newtime = index * 500
  console.log("newtime ", newtime)
  return of(index).pipe(delay(newtime))
}),

请注意,我将通过 of(index) 将值返回到流中。

我想我明白你对返回另一个 Observable 有什么顾虑。由于您想按顺序发出项目(仅在前一个完成后才发出一个),因此您必须将 concatMap 与另一个内部 Observable 一起使用。没有专门针对此功能的运算符,因为这是“可组合行为”,这意味着您可以通过组合现有运算符来实现此行为。

【讨论】:

  • 是的,确实有效。这就是我的想法,那就是有另一种做事方式。现在你解释了,好像好多了,谢谢!
  • @martin 如何在不使用间隔的情况下逐步增加 RxJS 延迟? stackoverflow.com/q/64625561/3073280
【解决方案2】:
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))

【讨论】:

  • 这似乎不起作用。它立即超时。也不会 switchmap 改变 observable 所以我会失去价值
  • @MarkSmith,我误解了你原来的问题。检查更新版本是否适合您。
  • 如何在不使用间隔的情况下逐步增加 RxJS 延迟? stackoverflow.com/q/64625561/3073280
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多