【问题标题】:Lazily delay each value of a infinite stream延迟无限流的每个值
【发布时间】:2019-11-13 15:58:00
【问题描述】:

正如标题所暗示的,我想将可迭代对象中的每个值延迟一段时间,同时保持可迭代对象的惰性评估。这是迄今为止我得到的最接近的方法,它适用于有限的可迭代对象或不会引发错误的对象

function* iter () {
  let i = 0
  while (true) yield i++
}

rxjs.zip(
  rxjs.from(iter()),
  rxjs.timer(500, 500),
  x => x
).subscribe(console.log)

【问题讨论】:

标签: rxjs observable rxjs6


【解决方案1】:

另一种可能是:

const source$ = interval(0);
source$.pipe(
    concatMap(x => 
        of(x).pipe(delay(500))
    )
).subscribe(console.log);

【讨论】:

  • 这似乎不适用于 source$ 设置为无限生成器 $source = from((function* () { let i = 0; while (true) yield i++ })())
  • 好吧,使用无限循环似乎不是一个聪明的主意,这不会导致最大调用堆栈错误吗?我不确定生成器是否能够防止这种情况发生,我正在尝试在 stackblitz 中测试该行为,但它会在输出面板中杀死浏览器 stackblitz.com/edit/rxjs-kzlifr?devtoolsheight=60
  • 生成器的整个想法是它们被延迟评估,因此您不会遇到无限循环,并且调用堆栈在这里不相关。无限生成器有其用途,请参阅:haskells 范围或此:github.com/tom-sherman/orangutan/blob/master/lib/…
猜你喜欢
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 2010-12-15
  • 1970-01-01
相关资源
最近更新 更多