提交 651b8352 编写于 作者: J Joao Moreno

event: fromPromise, stopwatch

上级 b892b243
......@@ -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);
}
\ No newline at end of file
......@@ -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);
});
});
});
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册