给出一个事件流,例如(每个-
是10ms
)
--A-B--C-D
有了debounceTime(20)
,我们得到了
-----------D
有了throttleTime(20)
,我们得到了
--A----C--
有了throttleTime(20, undefined, {leading: true, trailing: true}
,我们得到了
--A----CD
我该如何保证每次发射之间有足够的时间,例如使用20ms
--A-----C--D
通常,throttleTime
与trailing: true
最接近,但是有时可能导致trailing
的输出与leading
的输出过于接近。
可以在rxviz.com上找到示例代码
答案 0 :(得分:2)
为每个项目连接一个空的延迟,该延迟不发出任何东西,仅在给定的时间后完成。
const { EMTPY, of, concat } = Rx;
const { concatMap, delay } = RxOperators;
events.pipe(
concatMap(item => concat(of(item), EMPTY.pipe(delay(20))))
);
如果事件流发出项目的速度快于所需的延迟,则可以使用zip
在间隔发出时发出事件。
const { interval, zip } = Rx;
zip(events, interval(20), (data, i) => data);
在任何情况下(例如,在任何情况下),此方法都不能保证每个发射的项目之间有n
秒。当间隔大于期望的延迟,然后事件流中的间隔很小时。
例如,zip
在您的示例中的发射延迟为20、30、50、60,最小延迟为20。
zip
在20、30、65、70且最小延迟为20的情况下不能完美工作。
答案 1 :(得分:0)
不确定是否可以使用现成的运算符来实现(可能有!),但是您可以通过在每个值上加时间戳并在两者之间添加必要的延迟来做到这一点:
delay
每个值按适当的数量concat
生成的序列下面是rxviz的说明。代码如下:
const minTimeBetween = 800
events.pipe(
timestamp(),
scan((a, x) => ({
...x,
delayBy: a === null
? 0
: Math.max(0, minTimeBetween - (x.timestamp - (a.timestamp + a.delayBy)))
}), null),
concatMap(x => of(x.value).pipe(
delay(x.delayBy)
))
);