Rom*_*man 6 reactive-programming rxjs
是否有一个RxJS中的运算符在不延迟"突发中的第一个事件"的情况下进行去抖动,但延迟(并且始终发出)"突发中的最后一个事件"?
像这样的东西:
---a----b-c-d-----e-f---
之后awesome-debounce(2 dashes)
成为:
---a----b------d--e----f
而正常的去抖将是:
-----a---------d-------f
这是油门和去抖之间的混合......
嗯,这是我能想到的最简单的解决方案。对您来说有趣的部分是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();
Run Code Online (Sandbox Code Playgroud)
内部notification
Observable 仅用于throttle()
操作员,因此我可以在需要时手动重置其计时器。我还必须将这个 Observable 变成“热的”,以便独立于throttle()
.
归档时间: |
|
查看次数: |
1392 次 |
最近记录: |