Skip to content

Instantly share code, notes, and snippets.

@Zaggen
Created April 4, 2017 02:54
Show Gist options
  • Save Zaggen/de8edd12eb2c82f22b30b71444894a5b to your computer and use it in GitHub Desktop.
Save Zaggen/de8edd12eb2c82f22b30b71444894a5b to your computer and use it in GitHub Desktop.
Event Emitter implementation in typescript
declare const _
export class EventEmitter {
_listeners: {[key: string]: Function[]} = {}
_eventQueue: {[key: string]: any[]} = {}
on(eventName, listener: Function) {
this._listeners[eventName] = this._listeners[eventName] || []
this._listeners[eventName].push(listener)
this._callPendingEvents(eventName)
return listener
}
once(eventName, listener: Function) {
this._listeners[eventName] = this._listeners[eventName] || []
const listenerWrapper = (data)=> {
listener(data)
this.remove(eventName, listenerWrapper)
}
this._listeners[eventName].push(listenerWrapper)
this._callPendingEvents(eventName)
return listener
}
emit(eventName: string, ...data) {
this._callListeners(eventName, ...data)
return this
}
queueEvent(eventName: string, ...data){
if(this._listeners && this._listeners[eventName]){
this._callListeners(eventName, ...data)
}
else {
this._eventQueue[eventName] = data
}
}
_callPendingEvents(event): void {
if (this._eventQueue.hasOwnProperty(event)) {
const data = this._eventQueue[event]
this._callListeners(event, ...data)
delete this._eventQueue[event]
}
}
_callListeners(event, ...data): void {
_.each(this._listeners[event], (handler)=> {
_.defer(()=> handler(...data) )
})
}
remove(eventName?: string, listener?: Function) {
if(!eventName){
this._listeners = {}
this._eventQueue = {}
}
else if(this._listeners[eventName]){
if(listener){
const removedListenersCount = this._listeners[eventName].length
this._listeners[eventName] = null
return removedListenersCount
}
else {
const listenerIndex = _.findIndex(this._listeners[eventName], (listenerToCompare)=>
listener === listenerToCompare
)
const removed = _.pullAt(this._listeners[eventName], listenerIndex)
return removed.length
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment