events-emitter.js 2.71 KB
Newer Older
xhw committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
/* eslint-disable no-underscore-dangle */
export default {
	on(events, handler, priority) {
		const self = this;

		if (typeof handler !== 'function') return self;
		const method = priority ? 'unshift' : 'push';
		events.split(' ').forEach(event => {
			if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
			self.eventsListeners[event][method](handler);
		});

		return self;
	},

	once(events, handler, priority) {
		const self = this;
		if (typeof handler !== 'function') return self;

		function onceHandler(...args) {
			self.off(events, onceHandler);

			if (onceHandler.__emitterProxy) {
				delete onceHandler.__emitterProxy;
			}

			handler.apply(self, args);
		}

		onceHandler.__emitterProxy = handler;
		return self.on(events, onceHandler, priority);
	},

	onAny(handler, priority) {
		const self = this;
		if (typeof handler !== 'function') return self;
		const method = priority ? 'unshift' : 'push';

		if (self.eventsAnyListeners.indexOf(handler) < 0) {
			self.eventsAnyListeners[method](handler);
		}

		return self;
	},

	offAny(handler) {
		const self = this;
		if (!self.eventsAnyListeners) return self;
		const index = self.eventsAnyListeners.indexOf(handler);

		if (index >= 0) {
			self.eventsAnyListeners.splice(index, 1);
		}

		return self;
	},

	off(events, handler) {
		const self = this;
		if (!self.eventsListeners) return self;
		events.split(' ').forEach(event => {
			// self.native.off(event, handler);
			if (typeof handler === 'undefined') {
				self.eventsListeners[event] = [];
			} else if (self.eventsListeners[event]) {
				self.eventsListeners[event].forEach((eventHandler, index) => {
					if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler
						.__emitterProxy === handler) {
						self.eventsListeners[event].splice(index, 1);
					}
				});
			}
		});
		return self;
	},

	emit(...args) {
		const self = this;
		if (!self.eventsListeners) return self;
		let events;
		let data;
		let context;

		if (typeof args[0] === 'string' || Array.isArray(args[0])) {
			events = args[0];
			data = args.slice(1, args.length);
			context = self;
		} else {
			events = args[0].events;
			data = args[0].data;
			context = args[0].context || self;
		}

		data.unshift(context);

		const eventsArray = Array.isArray(events) ? events : events.split(' ');

		eventsArray.forEach(event => {
			// console.log(event)
			if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
				self.eventsAnyListeners.forEach(eventHandler => {
					eventHandler.apply(context, [event, ...data]);
				});
			}
			if (self.eventsListeners && self.eventsListeners[event]) {
				self.eventsListeners[event].forEach(eventHandler => {
					eventHandler.apply(context, data);
				});
			}
		});

		return self;
	}

};