Tester232323
Tester232323

Reputation: 301

Attaching and removing events to an event emitter

I am writing my own event emitter. I have written a few before but I want to write one that is in the style of on and off like Node and other systems. I am stuck in trying to understand how I could use off to remove a listener to an event emitter. This is because when on is called, I don't see how I can provide or generate a unique id to this listener.

EventSystem

class EventSystem {
    constructor(sender){
        this.sender = sender;
        this.events = {};
        return this;
    }

    create(name){
        return this.events[name] = { callbacks : [] };
    }

    on(name, callback){
        var event = this.events[name];
        if(!isDefined(event))
            event = this.create(name);

        event.callbacks.push(callback);
    }

    off(name){

    }

    emit(){
        var event = this.events[arguments[0]];
        if(isDefined(event)){
            var args = arguments.slice(1, arguments.length);
            for(var i = 0; i < event.callbacks.length; i++){
                event.callbacks[i](this.sender, args);
            }
        }
    }
}

Some Class

class Foo {
   constructor(){
     this.evs = new EventSystem(this);
     return this;
  }
  do(){
     this.evs.emit('do', arg1, arg2, arg3);
   }
}

var foo = new Foo();

foo.on('do', function(sender, arg1, arg2){
    console.log(arg1);
});

foo.do();

foo.off('do');

How can I assign some kind of ID when using .on so that I can use .off ?

Upvotes: 2

Views: 386

Answers (1)

ranjan un
ranjan un

Reputation: 84

Are you trying to implement namespace feature like in Jquery? Like below

    $("#element").on("click.myNamespace", function() { 
      console.log("doSomething");
    });

    $("#element").off("click.myNamespace");

Upvotes: 2

Related Questions