如何在 rxjs 上每 1 秒产生一次价值

zey*_*yue 2 javascript node.js rxjs reactivex

如果我已经有了一个 observable,那么我应该使用什么操作符来让这个 observable 产生价值,比如每 1 秒?

// this just an example, In my project, I can't control when the 
// observable will produce value. I can assume that it will produce
// value very fast.
const obs = from([1,2,3,4,5]);
Run Code Online (Sandbox Code Playgroud)

obs 会非常快地发出值 1,2,3...。但是如果我希望它每 1 秒发出一次值呢?我的意思是,只要确保 obs 发出值不要太快?

我检查了reactivex 的文档,但找不到操作员这样做。例如,延迟,它只是使值产生延迟一段时间,但保留了值之间的相对时间间隔,而 debounceTime 确实会定期产生值,但会忽略该时间窗口的值。

有人可以告诉我如何使可观察的产品在一段时间内产生价值而不遗漏或忽略价值吗?

Ste*_*ado 5

你可以像这样用一个可观察的间隔压缩它:

import { zip, from, interval } from rxjs

const obs = zip(
  from([1,2,3,4,5]),
  interval(1000),
  (val, i) => val // Just emit the value
)

obs.subscribe(val => console.log(val))
Run Code Online (Sandbox Code Playgroud)

如果您希望立即发出第一个值,则可以使用timer而不是interval

import { zip, from, timer } from rxjs

const obs = zip(
  from([1,2,3,4,5]),
  timer(0, 1000),
  (val, i) => val // Just emit the value
)

obs.subscribe(val => console.log(val))
Run Code Online (Sandbox Code Playgroud)

如果您愿意,也可以使用管道,如下所示:

import { from, interval } from rxjs
import { zip } from rxjs/operators

const obs = from([1,2,3,4,5])
  .pipe(
    zip(interval(1000), val => val)
  )

obs.subscribe(val => console.log(val))
Run Code Online (Sandbox Code Playgroud)

  • 2021 年更新!rxjs 中不推荐使用 zip 中的函数 (resultSelector)(又名 (val) => val)。通过取出函数并将其放入管道(map())中仍然可以重现该行为,如下所示: zip(from(myArray),interval(1000)).pipe(map((val)=>val[0 ])); 请注意,映射内返回的值是“val[0]”,而不仅仅是“val”。 (2认同)