Debounce без первоначальной задержки
есть ли оператор в RxJS, который дебютирует, не задерживая "первое событие в пакете", но задерживая (и всегда испуская)"последнее событие в пакете"?
что-то вроде этого:
---a----b-c-d-----e-f---
после awesome-debounce(2 dashes)
будет:
---a----b------d--e----f
в то время как нормальный debounce будет:
-----a---------d-------f
это своего рода смесь между дроссельной заслонкой и debounce...
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
Observable используется только для throttle()
оператор поэтому я могу переустановить свой таймер вручную когда мне. Мне также пришлось превратить это наблюдаемое в "горячая" быть независимым от внутренних подписок от throttle()
.
это действительно полезный тип debounce для многих ситуаций. Использовать merge
, throttleTime
и debounceTime
следующим образом:
Rx.Observable.merge(source.throttleTime(1000), source.debounceTime(2000))
полный пример здесь http://jsbin.com/godocuqiwo/edit?js, консоль
Примечание: он будет излучать не только первое и последнее значение в интервале debounce, но и значения, производимые дроссельной заслонкой (что обычно ожидается и необходимо, например, для прокрутки).