提交 f56c9e2b 编写于 作者: R Rob Lourens

Fix #29642 - debounced event fired multiple times for a single call with `leading = true`

上级 1291d9e8
......@@ -315,10 +315,13 @@ export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I)
let subscription: IDisposable;
let output: O;
let handle: number;
let numDebouncedCalls = 0;
const emitter = new Emitter<O>({
onFirstListenerAdd() {
subscription = event(cur => {
numDebouncedCalls++;
output = merger(output, cur);
if (!handle && leading) {
emitter.fire(output);
......@@ -328,8 +331,12 @@ export function debounceEvent<I, O>(event: Event<I>, merger: (last: O, event: I)
handle = setTimeout(() => {
let _output = output;
output = undefined;
emitter.fire(_output);
if (!leading || numDebouncedCalls > 1) {
emitter.fire(_output);
}
handle = null;
numDebouncedCalls = 0;
}, delay);
});
},
......
......@@ -209,6 +209,42 @@ suite('Event', function () {
doc.setText('2');
doc.setText('3');
});
test('Debounce Event - leading', function (done: () => void) {
const emitter = new Emitter<void>();
let debounced = debounceEvent(emitter.event, (l, e) => e, 0, /*leading=*/true);
let calls = 0;
debounced(() => {
calls++;
});
// If the source event is fired once, the debounced (on the leading edge) event should be fired only once
emitter.fire();
setTimeout(() => {
assert.equal(calls, 1);
done();
});
});
test('Debounce Event - leading', function (done: () => void) {
const emitter = new Emitter<void>();
let debounced = debounceEvent(emitter.event, (l, e) => e, 0, /*leading=*/true);
let calls = 0;
debounced(() => {
calls++;
});
// If the source event is fired multiple times, the debounced (on the leading edge) event should be fired twice
emitter.fire();
emitter.fire();
emitter.fire();
setTimeout(() => {
assert.equal(calls, 2);
done();
});
});
});
suite('Event utils', () => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册