lenye_base
Version:
基础方法
159 lines (132 loc) • 3.17 kB
JavaScript
;
require('./get_tag.js');
require('./is_array.js');
var is_object = require('./is_object.js');
var is_function = require('./is_function.js');
require('./for_each.js');
require('./is.js');
require('./is_date.js');
require('./is_shallow_equal.js');
var find_index = require('./find_index.js');
/**
* function handle1(a, b, c) {
* console.log('one', a, b, c);
* }
*
* function handle2(a, b, c) {
* console.log('two', a, b, c);
* }
*
* function handle3(a, b, c) {
* console.log('three', a, b, c);
* }
*
* emitter
* .on('demo', handle1)
* .once('demo', handle2)
* .on('demo', handle3);
*
* emitter.emit('demo', [1, 2, 3]);
*/
function EventEmitter() {
this.__events = {};
}
function isListener(listener) {
if (is_function(listener)) {
return true;
} else if (listener && is_object(listener)) {
return isListener(listener.listener);
} else {
return false;
}
}
var prototype = EventEmitter.prototype;
/**
* on
* @param {String} eventName
* @param {Function} listener
* @return {Object}
*/
prototype.on = function (eventName, listener) {
if (!eventName || !listener) return;
if (!isListener(listener)) {
throw new TypeError('listener is a function');
}
var events = this.__events;
var listeners = events[eventName] = events[eventName] || [];
var listenerIsWrapped = is_object(listener); // not repeat
if (find_index(listeners, listener) === -1) {
var listenerOnce = {
listener: listener,
once: false
};
listeners.push(listenerIsWrapped ? listener : listenerOnce);
console.log(listeners);
}
return this;
};
/**
* once
* @param {String} eventName
* @param {Function} listener
* @return {Object} can chained call
*/
prototype.once = function (eventName, listener) {
return this.on(eventName, {
listener: listener,
once: true
});
};
/**
* off
* @param {String} eventName
* @param {Function} listener
* @return {Object} can chained call
*/
prototype.off = function (eventName, listener) {
var listeners = this.__events[eventName];
if (!listeners) return;
var index;
for (var i = 0, len = listeners.length; i < len; i++) {
if (listeners[i] && listeners[i].listener === listener) {
index = i;
break;
}
}
if (typeof index !== 'undefined') {
listeners.splice(index, 1, null);
}
return this;
};
/**
* emit
* @param {String} eventName
* @param {Array} args
* @return {Object} can chained call
*/
prototype.emit = function (eventName, args) {
var listeners = this.__events[eventName];
if (!listeners) return;
for (var i = 0; i < listeners.length; i++) {
var listener = listeners[i];
if (listener) {
listener.listener.apply(this, args || []);
if (listener.once) {
this.off(eventName, listener.listener);
}
}
}
return this;
};
/**
* allOff && allOne
* @param {String[]}
*/
prototype.allOff = function (eventName) {
if (eventName && this.__events[eventName]) {
this.__events[eventName] = [];
} else {
this.__events = {};
}
};
module.exports = EventEmitter;