Дебадить без первоначальной задержки

Есть ли в RxJS оператор, который отменяет работу, не задерживая "первое событие в серии", но задерживая (и всегда испуская) "последнее событие в серии"?

Что-то вроде этого:

---a----b-c-d-----e-f---

после awesome-debounce(2 dashes) будет выглядеть так:

---a----b------d--e----f

в то время как нормальный debounce будет:

-----a---------d-------f

Это своего рода смесь между дросселем и дебатом...

2 ответа

Решение

Хм, это самое простое решение, которое я могу придумать. Интересная часть для вас 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 Наблюдаемый используется только для throttle() оператор, чтобы я мог сбросить таймер вручную, когда мне нужно. Мне также пришлось превратить этот Observable в "горячий", чтобы быть независимым от внутренних подписок от throttle(),

Это действительно полезный тип debounce для многих ситуаций. использование merge, throttleTime а также debounceTime следующим образом:

Rx.Observable.merge(source.throttleTime(1000), source.debounceTime(2000))

Полный пример здесь http://jsbin.com/godocuqiwo/edit?js,console

Примечание: он будет выдавать не только первое и последнее значение в интервале отладки, но также и значения, создаваемые дросселем (что обычно ожидается и необходимо, как, например, для отладки прокрутки).

Другие вопросы по тегам