FB Emitter

by wittnl

HTML

<script type="text/javascript">
function Emitter() {
  this.subscriptions = {};
}

Emitter.prototype.subscribe = function (eventName, callback) {
  /* const subs = this.subscriptions[eventName] || {};
  const len = ""+Object.keys(subs).length;
  subs[ len ] = callback;
  this.subscriptions[eventName] = subs;
  
  return {
    release () {
      delete subs[len];
    }
  } */
  
  const subs = this.subscriptions[eventName] || new Map();
  const key = subs.size;
  subs.set(key, callback);
  this.subscriptions[eventName] = subs;
  
  return {
  	release () {
    	subs.delete(key);
    }
  }
};

Emitter.prototype.emit = function (eventName, ...args) {
/* 	console.log('Subscriptions', this.subscriptions[eventName]);
	Object.keys(this.subscriptions[eventName]).forEach(id => {
	    const callback = this.subscriptions[eventName][id];
	    callback.apply(undefined, args);
	  });
	 */  
   
  for (const [ , callback ] of this.subscriptions[eventName]) {
    callback.apply(undefined, args);
  }
};

const em = new Emitter();

function emit(t) {
  em.emit(t);
}

</script>


<input id="click" type="button" value="click" onclick="emit('click')" />
<input id="load" type="button" value="load" onclick="emit('load')" />

JavaScript

const sub1 = em.subscribe('click', () => {
	console.log('A click!');
  sub1.release();  
});

const sub2 = em.subscribe('load', () => { 
  console.log('A load!') 
});

const sub3 = em.subscribe('click', () => {
	console.log('Another click!');
});