nodejs事件模块events
前言
events模块为提供了 EventEmitter 类,这是在 Node.js 中处理事件的关键
基本引入和使用
const EventEmitter = require('events') //引入
const myEmitter= new EventEmitter() //创建EventEmitter 对象
//注册事件 eventsName
myEmitter.on('eventsName',fn) //相当于emitter.addListener()
//注册一次性事件
myEmitter.once('eventsName', fn) //触发一次之后失效
//触发事件eventsName事件
myEmitter.emit("eventsName",[param]) // [ ]表示可选,绑定的事件需要参数-则提供
//移除事件
myEmitter.off('eventsName', fn); //相当于emitter.removeListener()
深入
模拟实现EventEmitter
分析:上面使用了 new EventEmitter(),说明它是一个构造函数,所以
class EventEmitter {
constructor() {} //构造器
}
分析:每个事件对象(EventEmitter )可以监听多个事件(eventsName),
每个事件(eventsName)可以绑定多个监听器,
大概就是EventEmitter[events][ eventName] => [fn1,fn2]
所以:
events: {
eventName1: [
function fn1() {},
function fn2() {}
]
... //类似的--多个不同的eventNama
}
别忘了在构造器中初始化events
class EventEmitter {
constructor() {
this._events = {}
}
}
每个事件对象(EventEmitter)有on\emit\off\once几个方法,我们来逐个分析
分析------on
on(事件名, 监听器),绑定了之后相当于我们上面的eventName1里面的function listener1() {},其实就是往数组里面放东西,只不过这个东西是个可执行的函数,所以:
on(eventName, fn){
if(this._events[eventName]) {
//如果已经存在说明它正在绑定第N个监听器
this._events[eventName].push(fn)
}else{
//否则它绑定第一个监听器----这里的"[]"必须加,它是个数组
this._events[eventName] = [fn]
}
}
分析------emit
emit触发事件,上面的on给每个事件分配了一个数组,数组中放监听器,这里只要把监听器拿出来一次执行就可以了,但注意先注册的先执行
官方文档有句话:
触发事件。按照事件被注册的顺序同步地调用每个事件监听器
因为之前时push进去的,所以我们用遍历执行就可以了,所以:
emit(eventName, ...args){
if(this._events[eventName]){
this._events[eventName].forEach(item => {
item(...args) //这里的item就是一个函数,args可选
})
}
}
分析------off
off(事件名,监听器),不难理解:根据时间名找到对应的数组,根据监听器的名称在数组中找到监听器 拿掉就可以了
off(eventName,fn) {
if(this._events[eventName]) {
//这里就是一个数组操作,换成其他的也行,比如先找到对应下标,然后splice也行
this._events[eventName] = this._events[eventName].filter(fn=>(fn !== listener))
}
else return
}
分析------once
once执行一次之后失效—执行一次之后从数组中拿掉;是不是有思路了?数组变异方法走一波?呃。。这里就不秀了,上面的off就是移除,我调我自己不就完四了(其实除了常用的几个数组方法,基本上面向帮助文档开发,so!帮助文档帮助文档帮助文档!)
- 这个源码我没怎么看懂,先不写上来了,原理大概是这样哦~
end
看源码,学习别人的思想
我从来没想过失败!
本文地址:https://blog.csdn.net/qq_39438801/article/details/110163708
上一篇: python中print格式化输出的问题
下一篇: 完美替换html代码