tiny-events
Version:
A very tiny EventEmitter implementation for client- and server-side code.
76 lines (57 loc) • 1.73 kB
JavaScript
function EventEmitter() {
this._listeners = {};
}
EventEmitter.prototype.on = function _on(type, listener) {
if (!Array.isArray(this._listeners[type])) {
this._listeners[type] = [];
}
if (this._listeners[type].indexOf(listener) === -1) {
this._listeners[type].push(listener);
}
return this;
};
EventEmitter.prototype.once = function _once(type, listener) {
var self = this;
function __once() {
for (var args = [], i = 0; i < arguments.length; i += 1) {
args[i] = arguments[i];
}
self.off(type, __once);
listener.apply(self, args);
}
__once.listener = listener;
return this.on(type, __once);
};
EventEmitter.prototype.off = function _off(type, listener) {
if (!Array.isArray(this._listeners[type])) {
return this;
}
if (typeof listener === 'undefined') {
this._listeners[type] = [];
return this;
}
var index = this._listeners[type].indexOf(listener);
if (index === -1) {
for (var i = 0; i < this._listeners[type].length; i += 1) {
if (this._listeners[type][i].listener === listener) {
index = i;
break;
}
}
}
this._listeners[type].splice(index, 1);
return this;
};
EventEmitter.prototype.emit = function _emit(type) {
if (!Array.isArray(this._listeners[type])) {
return this;
}
for (var args = [], i = 1; i < arguments.length; i += 1) {
args[i - 1] = arguments[i];
}
this._listeners[type].forEach(function __emit(listener) {
listener.apply(this, args);
}, this);
return this;
};
module.exports.EventEmitter = EventEmitter;