Support disposing of EventEmitters
This commit is contained in:
@@ -16,11 +16,13 @@ export interface IEvent<T> {
|
|||||||
export interface IEventEmitter<T> {
|
export interface IEventEmitter<T> {
|
||||||
event: IEvent<T>;
|
event: IEvent<T>;
|
||||||
fire(data: T): void;
|
fire(data: T): void;
|
||||||
|
dispose(): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class EventEmitter<T> implements IEventEmitter<T> {
|
export class EventEmitter<T> implements IEventEmitter<T> {
|
||||||
private _listeners: IListener<T>[] = [];
|
private _listeners: IListener<T>[] = [];
|
||||||
private _event?: IEvent<T>;
|
private _event?: IEvent<T>;
|
||||||
|
private _disposed: boolean = false;
|
||||||
|
|
||||||
public get event(): IEvent<T> {
|
public get event(): IEvent<T> {
|
||||||
if (!this._event) {
|
if (!this._event) {
|
||||||
@@ -28,10 +30,12 @@ export class EventEmitter<T> implements IEventEmitter<T> {
|
|||||||
this._listeners.push(listener);
|
this._listeners.push(listener);
|
||||||
const disposable = {
|
const disposable = {
|
||||||
dispose: () => {
|
dispose: () => {
|
||||||
for (let i = 0; i < this._listeners.length; i++) {
|
if (!this._disposed) {
|
||||||
if (this._listeners[i] === listener) {
|
for (let i = 0; i < this._listeners.length; i++) {
|
||||||
this._listeners.splice(i, 1);
|
if (this._listeners[i] === listener) {
|
||||||
return;
|
this._listeners.splice(i, 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -51,4 +55,12 @@ export class EventEmitter<T> implements IEventEmitter<T> {
|
|||||||
queue[i].call(undefined, data);
|
queue[i].call(undefined, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
if (this._listeners) {
|
||||||
|
this._listeners.splice(0, this._listeners.length);
|
||||||
|
}
|
||||||
|
this._disposed = true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user