Shane Jix

[Snippet] - EventEmitter

create:January 20, 2022  update:April 12, 2022  ☕️ 1 min read

同步链接: 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 国际」许可协议进行许可。 声明:转载请注明出处!

Edit on GitHubDiscuss on GitHub


Shane Jix

Personal blog by Shane Jix. I explain with words and code.

LinksTools
© 2019 - 2022, Built withGatsby