当前位置: 首页 > Web前端 > JavaScript

发布订阅模式EventEmitter

时间:2023-03-26 22:34:04 JavaScript

Node.js的事件模块提供了一个EventEmitter对象,用于Node.js中事件的统一管理。因为Node.js采用了事件驱动的机制,而EventEmitter是Node.js实现事件驱动的基础。在EventEmitter的基础上,Node.js中几乎所有的模块都继承这个类来实现异步事件驱动的架构。示例varevents=require('events');vareventEmitter=newevents.EventEmitter();eventEmitter.on('say',function(name){console.log('Hello',name);})eventEmitter.emit('say','Jack');比较了EventEmitter模块的APIaddListener和removeListener,on和off方法。addListener方法的作用是为指定的事件添加一个监听器。其实on方法实现的功能是一样的。On实际上是addListener方法的别名。两个实现的功能是一样的,removeListener方法都是用来移除一个事件的监听器,off也是removeListener的别名。varevents=require("events")const{emit}=require("process")varemitter=newevents.EventEmitter()functionhello1(name){console.log("1",name)}functionhello2(name){console.log("2",name)}emitter.addListener("say",hello1)emitter.addListener("say",hello2)emitter.emit("say","jake")//1jake//2jakeemitter.removeListener("say",hello1)emitter.emit("say","jake")//2jakeremoveListener和removeAllListenersremoveListener方法是指移除指定事件的某个监听器,removeAllListeners是指移除所有除指定事件外的侦听器。emitter.removeAllListeners('say');emitter.emit('say','John');//removeAllListeners移除say事件上的所有监听器//所以没有输出on和once方法的区别onandonce是:on方法添加的监听器可以持续监听指定事件对应的事件;而once方法添加的监听器监听一次后就会被淘汰。emitter.once('see',hello);emitter.emit('see','Tom');//只有在Tom实现EventEmitter函数EventEmitter(){this.__events={}}EventEmitter.VERSION=时才输出hello'1.0.0';EventEmitter.prototype.on=function(eventName,listener){if(!eventName||!listener)return;//判断回调监听器是否为函数if(!isValidListener(listener)){thrownewTypeError('listenermustbeafunction');}varevents=this.__events;varlisteners=events[eventName]=events[eventName]||[];varlistenerIsWrapped=typeoflistener==='object';//不重复添加事件,判断是否相同}返回这个;};//判断是否是有效的监听器functionisValidListener(listener){if(typeoflistener==='function'){returntrue;}elseif(listener&&typeoflistener==='object'){returnisValidListener(listener.listener);}else{返回错误;}}//顾名思义,用于判断是否存在新的自定义事件functionindexOf(array,item){varresult=-1item=typeofitem==='object'?item.listener:项目;对于(vari=0,len=array.length;i