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!');
});