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

时间:2018-12-24 11:29:13

标签: javascript node.js rxjs reactivex

如果我已经有一个可观测的,那么我应该使用什么运算符来实现 可以观察到每1秒产生一次价值?

allow_url_fopen = On

obs将很快发出值1,2,3...。但是如果我想要 每1秒发出一次值?我的意思是,请确保Obs也不会散发价值 快速吗?

我从reactx检查了文档,但找不到操作员。 例如,延迟,这只会使值产生延迟一些时间,但保留值之间的相对时间间隔,以及debounceTime 确实会定期产生价值,但会在那个时间窗口忽略价值。

有人可以告诉我如何在期间内产生可观察的产值 并不会错过或忽略值?

任何帮助将不胜感激!

对不起,我英语不好。

3 个答案:

答案 0 :(得分:3)

您可以使用如下所示的 interval 间隔 zip

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

如果您希望立即发出第一个值,则可以使用 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))

如果愿意,还可以使用管道,例如:

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

答案 1 :(得分:0)

您可以尝试这种方式

var source = Rx.Observable
  .range(1, 10)
  .concatMap(function (x) {
    return Rx.Observable
      .of(x)
      .delay(1000);
  })
 .timeInterval();

答案 2 :(得分:0)

您确实可以使用delay,但必须将每个延迟的值转换为Observable,然后将它们与concatMap合并为序列。

from([1,2,3,4,5]).pipe(
  concatMap(v => of(v).pipe(delay(1000))),
)

您可以使用zip,但这仅适用于测试数据。 zip仅在所有源可观察对象发出相同数量的项目时发出。这意味着,如果一个Observable的发射速度非常快,然后放慢速度,然后第二个Observable的发射速度很快,那么它的发射速度将比1s延迟快。即使intervalzip组合在一起,也会发生这种情况,因为zip在内部缓冲所有值,因此它可能堆叠来自interval的多个发射,然后如果第二个Observable发出非常快。