mirror of
https://github.com/Microsoft/vscode
synced 2024-10-13 06:48:17 +00:00
event: fromPromise, stopwatch
This commit is contained in:
parent
b892b24377
commit
651b83523f
|
@ -152,7 +152,25 @@ export function fromEventEmitter<T>(emitter: EventEmitter, eventType: string): E
|
|||
};
|
||||
}
|
||||
|
||||
export function fromPromise<T>(promise: TPromise<Event<T>>): Event<T> {
|
||||
export function fromPromise(promise: TPromise<any>): Event<void> {
|
||||
const emitter = new Emitter<void>();
|
||||
let shouldEmit = false;
|
||||
|
||||
promise
|
||||
.then(null, () => null)
|
||||
.then(() => {
|
||||
if (!shouldEmit) {
|
||||
setTimeout(() => emitter.fire(), 0);
|
||||
} else {
|
||||
emitter.fire();
|
||||
}
|
||||
});
|
||||
|
||||
shouldEmit = true;
|
||||
return emitter.event;
|
||||
}
|
||||
|
||||
export function delayed<T>(promise: TPromise<Event<T>>): Event<T> {
|
||||
let toCancel: TPromise<any> = null;
|
||||
let listener: IDisposable = null;
|
||||
|
||||
|
@ -275,3 +293,8 @@ export class EventBufferer {
|
|||
buffer.forEach(flush => flush());
|
||||
}
|
||||
}
|
||||
|
||||
export function stopwatch<T>(event: Event<T>): Event<number> {
|
||||
const start = new Date().getTime();
|
||||
return mapEvent(once(event), _ => new Date().getTime() - start);
|
||||
}
|
|
@ -5,10 +5,11 @@
|
|||
'use strict';
|
||||
|
||||
import * as assert from 'assert';
|
||||
import Event, {Emitter, fromEventEmitter, debounceEvent, EventBufferer, once} from 'vs/base/common/event';
|
||||
import Event, {Emitter, fromEventEmitter, debounceEvent, EventBufferer, once, fromPromise, stopwatch} 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');
|
||||
import {TPromise} from 'vs/base/common/winjs.base';
|
||||
|
||||
namespace Samples {
|
||||
|
||||
|
@ -282,4 +283,67 @@ suite('EventBufferer', () => {
|
|||
listener1.dispose();
|
||||
listener2.dispose();
|
||||
});
|
||||
});
|
||||
|
||||
suite('fromPromise', () => {
|
||||
|
||||
test('should emit when done', () => {
|
||||
let count = 0;
|
||||
|
||||
const event = fromPromise(TPromise.as(null));
|
||||
event(() => count++);
|
||||
|
||||
assert.equal(count, 0);
|
||||
|
||||
return TPromise.timeout(10).then(() => {
|
||||
assert.equal(count, 1);
|
||||
});
|
||||
});
|
||||
|
||||
test('should emit when done - setTimeout', () => {
|
||||
let count = 0;
|
||||
|
||||
const event = fromPromise(TPromise.timeout(5));
|
||||
event(() => count++);
|
||||
|
||||
assert.equal(count, 0);
|
||||
|
||||
return TPromise.timeout(10).then(() => {
|
||||
assert.equal(count, 1);
|
||||
});
|
||||
});
|
||||
|
||||
test('should emit when done - setTimeout', () => {
|
||||
let count = 0;
|
||||
|
||||
const event = fromPromise(TPromise.timeout(10));
|
||||
event(() => count++);
|
||||
|
||||
assert.equal(count, 0);
|
||||
|
||||
return TPromise.timeout(0).then(() => {
|
||||
assert.equal(count, 0);
|
||||
|
||||
return TPromise.timeout(10).then(() => {
|
||||
assert.equal(count, 1);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
suite('stopwatch', () => {
|
||||
|
||||
test('should emit when done', () => {
|
||||
const emitter = new Emitter<void>();
|
||||
const event = stopwatch(emitter.event);
|
||||
|
||||
return new TPromise(c => {
|
||||
event(duration => {
|
||||
assert(duration > 5);
|
||||
c(null);
|
||||
});
|
||||
|
||||
setTimeout(() => emitter.fire(), 5);
|
||||
});
|
||||
});
|
||||
});
|
Loading…
Reference in a new issue