1.events的使用
const EventEmitter = require("events");
const util = require("util");
// const event = new EventEmitter(); //这是直接实例化events
function Man() {}
util.inherits(Man, EventEmitter); // 实现原型的继承
const event = new Man(); // 区别到具体的类,实例化类
event.on("做动作", (who) => {
console.log(who + "哭");
});
event.on("做动作", (who) => {
console.log(who + "笑");
});
const others = (who) => {
console.log(who + "其他动作");
};
event.on("做动作", others); //订阅事件
event.emit("做动作", "张三"); //发布事件 第一个参数事件名称,后面的都是传递的参数
console.log("=================================");
event.off("做动作", others); // 卸载删除某个监听事件
event.emit("做动作", "张三");
console.log("=================================");
event.once("做动作", others); // 监听事件只执行一次,之后就删除
event.emit("做动作", "张三");
console.log("===============");
event.emit("做动作", "张三");
2.events的实现原理(发布订阅)
function MyEventEmitter() {
this.events = {};
}
// 订阅事件
MyEventEmitter.prototype.on = function (eventName, callback) {
if (!this.events) {
this.events = Object.create(null);
}
if (!this.events[eventName]) {
this.events[eventName] = [callback];
} else {
this.events[eventName].push(callback);
}
};
// 触发事件
MyEventEmitter.prototype.emit = function (eventName, ...args) {
const callbacks = this.events[eventName];
if (!this.events || !callbacks) return;
callbacks.forEach((cal) => {
cal(...args);
});
};
// 只订阅一次事件
MyEventEmitter.prototype.once = function (eventName, callback) {
const onceFn = (...args) => {
callback(...args);
this.off(eventName, onceFn);
};
onceFn.innerBack = callback;
this.on(eventName, onceFn);
};
// 取消事件
MyEventEmitter.prototype.off = function (eventName, callback) {
const callbacks = this.events[eventName];
if (!this.events || !callbacks) return;
this.events[eventName] = callbacks.filter(
(item) => item !== callback && item !== callback.innerBack
);
};
module.exports = MyEventEmitter;