提交 e02573f0 编写于 作者: J Joao Moreno

event buffer, nextTick, tests

上级 2a8bab87
......@@ -375,7 +375,7 @@ export function stopwatch<T>(event: Event<T>): Event<number> {
* // 4
* ```
*/
export function buffer<T>(event: Event<T>): Event<T> {
export function buffer<T>(event: Event<T>, nextTick = false): Event<T> {
let buffer: T[] = [];
let listener = event(e => {
if (buffer) {
......@@ -385,6 +385,11 @@ export function buffer<T>(event: Event<T>): Event<T> {
}
});
const flush = () => {
buffer.forEach(e => emitter.fire(e));
buffer = null;
};
const emitter = new Emitter<T>({
onFirstListenerAdd() {
if (!listener) {
......@@ -394,8 +399,11 @@ export function buffer<T>(event: Event<T>): Event<T> {
onFirstListenerDidAdd() {
if (buffer) {
buffer.forEach(e => emitter.fire(e));
buffer = null;
if (nextTick) {
setTimeout(flush);
} else {
flush();
}
}
},
......
......@@ -5,7 +5,7 @@
'use strict';
import * as assert from 'assert';
import Event, {Emitter, fromEventEmitter, debounceEvent, EventBufferer, once, fromPromise, stopwatch} from 'vs/base/common/event';
import Event, {Emitter, fromEventEmitter, debounceEvent, EventBufferer, once, fromPromise, stopwatch, buffer} 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');
......@@ -211,7 +211,9 @@ suite('Event',function(){
});
});
suite('EventBufferer', () => {
suite('Event utils', () => {
suite('EventBufferer', () => {
test('should not buffer when not wrapped', () => {
const bufferer = new EventBufferer();
......@@ -283,9 +285,9 @@ suite('EventBufferer', () => {
listener1.dispose();
listener2.dispose();
});
});
});
suite('fromPromise', () => {
suite('fromPromise', () => {
test('should emit when done', () => {
let count = 0;
......@@ -329,9 +331,9 @@ suite('fromPromise', () => {
});
});
});
});
});
suite('stopwatch', () => {
suite('stopwatch', () => {
test('should emit', () => {
const emitter = new Emitter<void>();
......@@ -351,4 +353,55 @@ suite('stopwatch', () => {
setTimeout(() => emitter.fire(), 10);
});
});
});
suite('buffer', () => {
test('should buffer events', () => {
const result = [];
const emitter = new Emitter<number>();
const event = emitter.event;
const bufferedEvent = buffer(event);
emitter.fire(1);
emitter.fire(2);
emitter.fire(3);
assert.deepEqual(result, []);
const listener = bufferedEvent(num => result.push(num));
assert.deepEqual(result, [1,2,3]);
emitter.fire(4);
assert.deepEqual(result, [1,2,3,4]);
listener.dispose();
emitter.fire(5);
assert.deepEqual(result, [1,2,3,4]);
});
test('should buffer events on next tick', () => {
const result = [];
const emitter = new Emitter<number>();
const event = emitter.event;
const bufferedEvent = buffer(event, true);
emitter.fire(1);
emitter.fire(2);
emitter.fire(3);
assert.deepEqual(result, []);
const listener = bufferedEvent(num => result.push(num));
assert.deepEqual(result, []);
return TPromise.timeout(10).then(() => {
emitter.fire(4);
assert.deepEqual(result, [1,2,3,4]);
listener.dispose();
emitter.fire(5);
assert.deepEqual(result, [1,2,3,4]);
});
});
});
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册