diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index f6b559fa460da6c6a6ff2d2ad258bf2dcb82df93..d866111a8222d52b6ae99333115fa5d3678db5db 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -199,8 +199,9 @@ export function debounceEvent(event: Event, merger: (last: O, event: I) output = merger(output, cur); clearTimeout(handle); handle = setTimeout(() => { - emitter.fire(output); + let _output = output; output = undefined; + emitter.fire(_output); }, delay); }); }, @@ -262,4 +263,4 @@ export class EventBufferer { this.buffers.pop(); buffer.forEach(flush => flush()); } -} \ No newline at end of file +} diff --git a/src/vs/base/test/common/event.test.ts b/src/vs/base/test/common/event.test.ts index 24c23e3b85c76dfb57d5cfa44d150de1d00b0cc6..416005e8bc42d3abac9725de621b8b32311b34fb 100644 --- a/src/vs/base/test/common/event.test.ts +++ b/src/vs/base/test/common/event.test.ts @@ -5,7 +5,7 @@ 'use strict'; import * as assert from 'assert'; -import Event, {Emitter, fromEventEmitter, EventBufferer} from 'vs/base/common/event'; +import Event, {Emitter, fromEventEmitter, debounceEvent, EventBufferer} from 'vs/base/common/event'; import {IDisposable} from 'vs/base/common/lifecycle'; import {EventEmitter} from 'vs/base/common/eventEmitter'; import Errors = require('vs/base/common/errors'); @@ -177,6 +177,37 @@ suite('Event',function(){ Errors.setUnexpectedErrorHandler(origErrorHandler); } }); + + test('Debounce Event', function (done: () => void) { + let doc = new Samples.Document3(); + + let onDocDidChange = debounceEvent(doc.onDidChange, (prev: string[], cur) => { + if (!prev) { + prev = [cur]; + } else if (prev.indexOf(cur) < 0) { + prev.push(cur); + } + return prev; + }, 10); + + let count = 0; + + onDocDidChange(keys => { + count++; + assert.ok(keys, 'was not expecting keys.'); + if (count === 1) { + doc.setText('4'); + assert.deepEqual(keys, ['1', '2', '3']); + } else if (count === 2){ + assert.deepEqual(keys, ['4']); + done(); + } + }); + + doc.setText('1'); + doc.setText('2'); + doc.setText('3'); + }); }); suite('EventBufferer', () => {