/**
* 功能:自定义事件
* @param {string} on / emeit等
* @param {string} callback
* @returns {any} - any
*/
class EventEmitter {
constructor() {
this.events = {};
}
getEvents() {
return this.events;
}
once(eventName='', listener) {
return this.on(eventName, listener, 0);
}
on(eventName='', listener, timer = -1) {
let listeners = this.getListeners(eventName);
listeners.push({
listener,
timer,
});
}
emit(eventName='', ...args) {
return this.trigger(eventName, args);
}
remove(eventName='') {
this.events[eventName] && delete this.events[eventName];
}
off(eventName='', listener) {
let listeners = this.getListeners(eventName);
let index = listeners.findIndex((item) => item.listener === listener);
index !== -1 && listeners.splice(index, 1);
}
clear() {
this.events = {};
}
trigger(eventName='', args) {
let listeners = this.getListeners(eventName);
for (let i = 0; i < listeners.length; i++) {
let listener = listeners[i];
if (listener) {
listener.listener.apply(this, args || []);
listener.timer === 0 && listeners.splice(i, 1);
listeners.length === 0 && delete this.events[eventName];
listener.timer !== -1 && listener.timer--;
}
}
}
getListeners(eventName='') {
return this.events[eventName] || (this.events[eventName] = []);
}
}
class SocketEmitter extends EventEmitter {
constructor() {
super();
this.sokectEvents = [];
this.subActions = {};
}
disconnect() {
this.clear();
this.sokect && this.sokect.disconnect();
this.sokect = null;
}
/**
* 抽象socket监听方法
* @param {*} param0
*/
subscribe(eventName='', listener) {
this.on(eventName, listener);
if (this.sokectEvents.includes(eventName) || !this.sokect) {
return;
}
this.sokectEvents.push(eventName);
this.subActions[eventName] = this.subAction(eventName);
this.sokect && this.sokect.on(eventName, this.subActions[eventName]);
console.debug(`socket.io listener event -> ${eventName}`);
}
subAction(eventName='') {
return (data) => {
let json;
try {
json = JSON.parse(data);
} catch (e) {
json = data;
}
this.emit(eventName, json);
};
}
/**
* 抽象socket监听方法
* @param {*} param0
*/
unsubscribe(eventName='', listener) {
this.off(eventName, listener);
this.sokect && this.sokect.off(eventName, this.subActions[eventName]);
delete this.subActions[eventName];
this.sokectEvents = this.sokectEvents.filter((v) => v !== eventName);
console.debug(`socket.io unlistener event -> ${eventName}`);
}
}
const _global = window ;
const event = new SocketEmitter();
const LMEvent = (function () {
if (_global._LM_EVENT_) {
return _global._LM_EVENT_;
} else {
_global._LM_EVENT_ = event;
return event;
}
})();
export default LMEvent;