Skip to content

Instantly share code, notes, and snippets.

@monjer
Created August 28, 2017 09:51
Show Gist options
  • Select an option

  • Save monjer/f5de8355e900e95ba0e970bee4de5b2d to your computer and use it in GitHub Desktop.

Select an option

Save monjer/f5de8355e900e95ba0e970bee4de5b2d to your computer and use it in GitHub Desktop.
EventEmitter ES6 class
class EventEmitter{
constructor(){
this.events = null ;
}
on(name , callback , ctx){
let events = this.events || (this.events = {});
let handlers = events[name] || (events[name] = []);
handlers.push({
callback: callback,
ctx: ctx
})
}
off(name , callback ){
this.events = this.events || {};
let handlers = this.events[name];
let left = [];
let cb;
if(arguments.length == 0){
this.events = null;
return;
}
if(arguments.length == 1){
delete this.events[name];
return;
}
for(let i = 0 ; i < handlers.length ; i ++){
cb = handlers[i].callback ;
cb = cb.fn || cb;
if(cb !== callback){
left.push(handlers[i]);
}
}
if(left.length > 0){
this.events[name]= left;
}else{
delete this.events[name];
}
}
once(name , callback , ctx){
let self = this;
let proxy = function(...args){
callback.apply(ctx , args);
self.off(name , proxy , ctx);
}
proxy.fn = callback;
this.on(name , proxy , ctx);
}
emit(name , ...args){
let handlers = (this.events || [])[name];
let cb , ctx;
if(handlers && handlers.length > 0 ){
let length = handlers.length ;
for(let i = 0 ; i < length ; i++){
cb = handlers[i].callback;
ctx = handlers[i].ctx;
cb.apply(ctx , args)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment