如果我已经有一个可观测的,那么我应该使用什么运算符来实现 可以观察到每1秒产生一次价值?
allow_url_fopen = On
obs将很快发出值1,2,3...。但是如果我想要 每1秒发出一次值?我的意思是,请确保Obs也不会散发价值 快速吗?
我从reactx检查了文档,但找不到操作员。 例如,延迟,这只会使值产生延迟一些时间,但保留值之间的相对时间间隔,以及debounceTime 确实会定期产生价值,但会在那个时间窗口忽略价值。
有人可以告诉我如何在期间内产生可观察的产值 并不会错过或忽略值?
任何帮助将不胜感激!
对不起,我英语不好。
答案 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
延迟快。即使interval
和zip
组合在一起,也会发生这种情况,因为zip
在内部缓冲所有值,因此它可能堆叠来自interval
的多个发射,然后如果第二个Observable发出非常快。