【问题标题】:Guarantee `n` seconds between emit without waiting initially保证发射之间的“n”秒,而无需最初等待
【发布时间】:2019-02-10 14:12:16
【问题描述】:

给定一个事件流,例如(每个 -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

通常throttleTimetrailing: true 最接近,但有时会导致trailing 输出与leading 输出太接近。

示例代码可以在rxviz.com找到

【问题讨论】:

  • 你想要B 在你的输出中吗?您的最后一个示例中缺少它。

标签: rxjs


【解决方案1】:

1。连接延迟

为每个项目连接一个空延迟,它不会发出任何内容,仅在给定时间后完成。

const { EMTPY, of, concat } = Rx;
const { concatMap, delay } = RxOperators;

event$.pipe(
  concatMap(item => concat(of(item), EMPTY.pipe(delay(20))))
);

2。 ConcatMap 到计时器

将每个项目映射到一个计时器,该计时器从给定项目开始并在给定时间后完成。计时器完成时将发出下一个项目。计时器本身发出的值将被忽略。

const { timer } = Rx;
const { concatMap, ignoreElements, startWith } = RxOperators;

event$.pipe(
  concatMap(item => timer(20).pipe(ignoreElements(), startWith(item)))
);

3。间隔压缩(非最佳)

如果您的事件流发出的项目比所需的延迟快,您可以使用zip 在间隔发出时发出事件。

const { interval, zip } = Rx;
const { map } = RxOperators;

zip(event$, interval(20)).pipe(map(([item, i]) => item));

此方法不能保证在所有情况下每个发射项目之间的 n,例如当间隔大于所需延迟时,事件流中随后出现小间隔。

例如,zip 在您的示例中适用于 20、30、50、60 的发射,最小延迟为 20。
zip 不能完美地用于 20、30、65、70 的发射,最小延迟20.

interval 发出的速度快于事件的进入速度时,这些间隔项将堆积在zip 中。如果是这种情况,zip 将立即从其堆栈中压缩任何具有已存在间隔项的新事件,从而导致事件在没有预期延迟的情况下发出。

【讨论】:

    【解决方案2】:

    不确定是否有现成的运算符可用于实现此目的(可能有!),但您可以通过为每个值加上时间戳并在两者之间添加必要的延迟来做到这一点:

    1. 时间戳每个值
    2. 扫描序列并根据前一个值的有效时间戳计算相对延迟
    3. delay每个值适量
    4. 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)
      ))
    );
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多