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()运算符,因此我可以在需要时手动重置其计时器。为了独立于throttle()的内部订阅,我还必须将此Observable变为“hot”。

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

10-16 19:42