事件对象 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");
});
网友评论