nodejs的events事件

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;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值