Skip to content

Instantly share code, notes, and snippets.

@mikepuerto
Last active September 11, 2018 13:05
Show Gist options
  • Save mikepuerto/1418a024ab93e1cb353305c9ceadfbde to your computer and use it in GitHub Desktop.
Save mikepuerto/1418a024ab93e1cb353305c9ceadfbde to your computer and use it in GitHub Desktop.
Micro EventEmitter v2
/**
* micro event emitter
* @author [email protected]
* @gist https://gist.github.com/mikepuerto/1418a024ab93e1cb353305c9ceadfbde
*/
class EventEmitter {
constructor() {
this._eventHandlers = {};
}
on(event, callback, once = false) {
this._eventHandlers[event] = this._eventHandlers[event] || [];
this._eventHandlers[event].push({ callback, once });
}
once(event, callback) {
this.on(event, callback, true);
}
off(event, callback) {
if (!this._eventHandlers[event]) {
return;
}
this._eventHandlers[event].forEach((eventHandler, idx) => {
if (eventHandler.callback === callback) {
this._eventHandlers[event].splice(idx, 1);
}
});
return true;
}
emit(event, data) {
if (!this._eventHandlers[event] || !this._eventHandlers[event].length) {
return undefined;
}
const args = [].slice.call(arguments, 1);
this._eventHandlers[event].forEach(handler => {
handler.callback.apply(handler.callback, args);
handler.once && this.off(event, handler.callback);
});
}
}
export default EventEmitter;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment