Skip to content

Instantly share code, notes, and snippets.

@mkozhukharenko
Created June 30, 2016 20:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mkozhukharenko/784f8d4cf606fd3f7318f7d5f18e95ab to your computer and use it in GitHub Desktop.
Save mkozhukharenko/784f8d4cf606fd3f7318f7d5f18e95ab to your computer and use it in GitHub Desktop.
Simple Event Emitter Improved
// make EE singelton, add .off method
let instance = null;
class EventEmitter {
constructor() {
// ensure we have only one instance (singelton pattern)
if (!instance) {
instance = this;
}
this.events = {};
return instance;
}
// unsubscribe
off(name, fn) {
this.events[name] = this.events[name] || [];
let index = this.events[name].indexOf(fn);
this.events[name].splice(index, 1);
}
on(name, fn) {
this.events[name] = this.events[name] || [];
this.events[name].push(fn);
};
trigger(name, args) {
this.events[name] = this.events[name] || [];
this.events[name].forEach((fn) => fn(args));
};
}
// EE in real life.
// Store - it's out model.
class Store extends EventEmitter {
constructor(initalState) {
super()
this.__state = initalState;
};
get state() {
return this.__state
};
set state(state) {
this.trigger('update', state);
this.__state = state;
}
}
var store = new Store({});
store.on('update', function(newState) {
console.log('newState', newState);
// update DOM
});
// set new state
store.state = { name: 'Vasya Pupkin' };
store.state = { name: 'Petya Ivanov' };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment