欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

nodejs事件模块events

程序员文章站 2022-03-11 10:17:52
前言events模块为提供了 EventEmitter 类,这是在 Node.js 中处理事件的关键基本引入和使用const EventEmitter = require('events') //引入const myEmitter= new EventEmitter() //创建EventEmitter 对象//注册事件 eventsNamemyEmitter.on('eventsName',fn) //相当于emitter.addListener()//注册一次性事件myEmit...

前言

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

相关标签: node node.js