RxJS中的操作员是否在不延迟突发中的第一个事件的情况下进行去抖动,但是在突发中延迟(并且始终发出)"最后一个事件"?
这样的事情:
---a----b-c-d-----e-f---
awesome-debounce(2 dashes)
成为后的:
---a----b------d--e----f
正常的去抖动将是:
-----a---------d-------f
它是节流和去抖之间的混合......
答案 0 :(得分:3)
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()
运算符,因此我可以在需要时手动重置其计时器。我还必须将此Observable变为“hot”,以独立于throttle()
的内部订阅。
答案 1 :(得分:-1)
对于许多情况来说,这确实是有用的去抖动类型。以下一种方式使用merge
,throttleTime
和debounceTime
:
Rx.Observable.merge(source.throttleTime(1000), source.debounceTime(2000))
完整示例在这里http://jsbin.com/godocuqiwo/edit?js,console
注意:它不仅会在去抖动间隔中发出第一个和最后一个值,而且还会发出由油门产生的值(通常是预期和需要的值,例如滚动去抖动)。