SocketEmitter/index.js

/**
 * 功能:自定义事件
 * @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;