美文网首页
node 内置的模块 - 事件对象 events

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

作者: 弹力盒 | 来源:发表于2021-07-04 23:05 被阅读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");
    });
    

    相关文章

      网友评论

          本文标题:node 内置的模块 - 事件对象 events

          本文链接:https://www.haomeiwen.com/subject/nuovultx.html