node 内置的模块 - 事件对象 events

2021-07-04  本文已影响0人  弹力盒

事件对象 events

通过事件监听、派发的方式来更加优化的管理代码,使代码更加简洁,高效

基本使用

const events = require('events');
const eventEmitter = new events.eventEmitter();

// 监听事件类型,添加到事件队列中
eventEmitter.on('eventType', eventFn);

// 触发事件类型,遍历执行事件队列中所有的事件
eventEmitter.emit('eventType');

自定义事件对象的简单模拟

暂时只模拟 on(事件监听)、emit(事件派发)、off(事件清空)

const Express = require("express");
const app = Express();

/**
 * node 事件处理
 * 原理是通过一个对象来派发、监听事件
 * 以下用 EVENTS 对象来模拟
 *
 * 真正开发时可以使用 node 提供的 events 模块
 * const events = require('events');
 * const eventEmitter = new events.eventEmitter();
 *
 * 监听事件类型,添加到事件队列中
 * eventEmitter.on('eventType', eventFn);
 *
 * 触发事件类型,遍历执行事件队列中所有的事件
 * eventEmitter.emit('eventType');
 */

const EVENTS = {
  /**
   * 保存各种事件类型的事件队列,同一个事件类型的事件队列有可能有多个事件
   * events 的 key 表示事件类型,value 表示事件类型对应的事件队列
   */
  events: {
    // eg
    // click: [clickFn1, clickFn2, clickFn3]
  },

  /**
   * 事件监听
   * @param {事件类型} eventType
   * @param {事件监听函数} eventFn
   * on 的作用是将事件类型对应的触发函数添加到对应的事件队列中
   */
  on: function (eventType = "", eventFn) {
    if (this.events[eventType]) {
      this.events[eventType].push(eventFn);
    } else {
      this.events[eventType] = [eventFn];
    }
  },

  /**
   * 事件派发
   * @param {事件类型} eventType
   * @param {事件监听函数所需的参数} params
   * 由于监听的 事件类型 对应的事件队列中有可能有一个或多个,因此需要循环遍历执行
   */
  emit(eventType = "", params = "") {
    if (this.events[eventType]) {
      this.events[eventType].forEach((itemFn) => {
        itemFn(params);
      });
    } else {
      console.log(`当前并未监听 ${eventType} 事件`);
    }
  },

  /**
   * 清空某个事件类型的事件队列内容
   * @param {事件类型} eventType
   */
  off(eventType = "") {
    this.events[eventType] = [];
  },
};

// 监听 click 事件,将事件触发函数添加到事件队列中,此时队列中有一个待执行函数
EVENTS.on("click", function (str) {
  console.log(str || "click");
});

// 监听 click 事件,将事件触发函数添加到事件队列中,此时队列中有两个待执行函数
EVENTS.on("click", function (str) {
  console.log(str || "");
});

// 监听 click 事件,将事件触发函数添加到事件队列中,此时队列中有三个待执行函数
EVENTS.on("click", function (str) {
  console.log(str || "click2");
});

// 清空 click 事件类型对应的事件队列,此时队列中有零个待执行函数
EVENTS.off("click");

// 监听 click 事件,将事件触发函数添加到事件队列中,此时队列中有一个待执行函数
EVENTS.on("click", function (str) {
  console.log(str || "click2");
});

// 结果是,在 1s 后,只打印了 click2 和 当前并未监听 scascas 事件
setTimeout(() => {
  EVENTS.emit("click");
  EVENTS.emit("scascas");
}, 1000);

app.listen(20000, () => {
  console.log("server is running at http://127.0.0.1:20000");
});
上一篇下一篇

猜你喜欢

热点阅读