strudel
Version:
A front-end framework for back-end powered web.
84 lines (73 loc) • 1.66 kB
JavaScript
import { isFunction } from './helpers';
import handleError from './error';
/**
* Event listeners
* @type {{}}
*/
const events = {};
/**
* @classdesc Simple Event Emitter implementation - global
* @class
*/
class EventEmitter {
static getEvents() {
return events;
}
static removeAllListeners() {
Object.keys(events).forEach((prop) => {
delete events[prop];
});
}
/**
* Add event listener to the map
* @param {string} label
* @param {Function} callback
*/
$on(label, callback) {
if (!events[label]) {
events[label] = [];
}
events[label].push(callback);
}
/**
* Remove event listener from registry
* @param {string} label
* @param {Function} callback
* @returns {boolean}
*/
$off(label, callback) {
const listeners = events[label];
if (listeners && listeners.length) {
const index = listeners.reduce((i, listener, ind) => {
return (isFunction(listener) && listener === callback) ? i = ind : i;
}, -1);
if (index > -1) {
listeners.splice(index, 1);
events[label] = listeners;
return true;
}
}
return false;
}
/**
* Notifies listeners attached to event
* @param {string} label
* @param args
* @returns {boolean}
*/
$emit(label, ...args) {
const listeners = events[label];
if (listeners && listeners.length) {
try {
listeners.forEach((listener) => {
listener(...args);
});
} catch (e) {
handleError(e, this.constructor, 'event handler');
}
return true;
}
return false;
}
}
export default EventEmitter;