rxjs - 无初始延迟去抖

标签 rxjs reactive-programming

RxJS 中是否有一个操作符可以在不延迟“突发中的第一个事件”的情况下进行去抖动,但会延迟(并始终发出)“突发中的最后一个事件”?

像这样的东西:
---a----b-c-d-----e-f---
之后 awesome-debounce(2 dashes)变成:
---a----b------d--e----f
而正常的去抖动是:
-----a---------d-------f
这是 throttle 和去抖之间的混合......

最佳答案

嗯,这是我能想到的最简单的解决方案。对您来说有趣的部分是 awesomeDebounce()创建子链的函数。

它基本上只是结合了 throttle()debounceTime()运营商:

const Rx = require('rxjs');
const chai = require('chai');

let scheduler = new Rx.TestScheduler((actual, expected) => {
  chai.assert.deepEqual(actual, expected);
  console.log(actual);
});

function awesomeDebounce(source, timeWindow = 1000, scheduler = Rx.Scheduler.async) {
  let shared = source.share();
  let notification = shared
      .switchMap(val => Rx.Observable.of(val).delay(timeWindow, scheduler))
      .publish();

  notification.connect();

  return shared
    .throttle(() => notification)
    .merge(shared.debounceTime(timeWindow, scheduler))
    .distinctUntilChanged();
}

let sourceMarbles =   '---a----b-c-d-----e-f---';
let expectedMarbles = '---a----b------d--e----f';

// Create the test Observable
let observable = scheduler
  .createHotObservable(sourceMarbles)
  .let(source => awesomeDebounce(source, 30, scheduler));

scheduler.expectObservable(observable).toBe(expectedMarbles);
scheduler.flush();

内部notification Observable 仅用于 throttle()运算符(operator),因此我可以在需要时手动重置其计时器。我还必须将这个 Observable 变成“热的”以独立于来自 throttle() 的内部订阅。 .

关于rxjs - 无初始延迟去抖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43101064/

相关文章:

javascript - startWith() 运算符是否将 Observable 转换为 ReplaySubject(1)?

Javascript rxjs - 当从可观察到的最后一个值发出时执行某些操作

ios - 当且仅当 producerA 不抛出错误时如何执行 producerB?

java - 如何使用 Reactor 创建随机数生成器?

.net - .NET Rx 相对于经典事件的优势?

angular - 对于相互依赖数据的请求,可观察量是否是正确的解决方案?

javascript - "rxjs observable"需要多个而 Promise 不需要多个是什么意思

javascript - 根据特定条件加入 RxJs 中的两个可观察流

scala - 异步阻塞线程魔法

java - 带有 vararg observables 的 RxJava zip