[Snippet] - EventEmitter

同步链接: https://www.shanejix.com/posts/[Snippet] - EventEmitter/

API

-subscribe / addListener / on -
  publish / emit -
  unsubscribe / removeListener / off;

EventEmitter

class EventEmitter {
  constructor() {
    /**
     * 订阅中心
     *
     * {"type":[callback1,callback2,...]}
     *
     */
    this.events = {};
  }

  /**
   * subscribe event
   * @param {*} type
   * @param {*} callback
   */
  on(type, callback) {
    if (this.events[type]) {
      // 当前 type 类型已经订阅,则在数组后追加
      this.events[type].push(callback);
    } else {
      // 当前 type 类型未订阅,则初始化数组
      this.events[type] = [callback];
    }
  }

  /**
   * subscribe event
   * @param {*} type
   * @param {*} callback
   */
  subscribe(type, callback) {
    this.on(type, callback);
  }

  /**
   * subscribe event
   * @param {'*'} type
   * @param {*} callback
   */
  addListener(type, callback) {
    this.on(type, callback);
  }

  /**
   * emit event
   * @param {*} type
   */
  emit(type) {
    // 通知执行当前 type 类型的所有回调函数
    if (this.events[type] && this.events[type].length) {
      this.events[type].forEach((callback) => {
        callback();
      });
    }
  }

  /**
   * emit event
   * @param {*} type
   */
  publish(type) {
    this.emit(type);
  }

  /**
   * off event
   * @param {*} type
   * @param {*} callback
   */
  off(type, callback) {
    // 取消订阅当前 type 类型的 callback 回调
    if (this.events[type] && this.events[type].length) {
      this.events[type] = this.events[type].filter((cb) => cb !== callback);
    }
  }

  /**
   * off event
   * @param {*} type
   * @param {*} callback
   */
  unsubscribe(type, callback) {
    this.off(type, callback);
  }

  /**
   * off event
   * @param {*} type
   * @param {*} callback
   */
  removeListener(type, callback) {
    this.off(type, callback);
  }
}

usage

const eventEmitter = new EventEmitter();

eventEmitter.on("type", () => {
  console.log("type executed");
});

eventEmitter.emit("type");

作者:shanejix
出处:https://www.shanejix.com/posts/[Snippet] - EventEmitter/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
声明:转载请注明出处!

上一篇:java语言的三大特性


下一篇:thinkphp6: 给接口api做签名验证(php 8.1.1 / thinkphp v6.0.10LTS )