当前位置: 首页 > 后端技术 > Node.js

【节点事件模块Events】

时间:2023-04-03 18:28:08 Node.js

环境:Nodev8.2.1;Npmv5.3.0;OSWindows101,Node事件介绍Node的大部分核心API都采用通常的异步事件驱动架构,其中某些类型的对象(triggers)周期性地触发命名事件来调用函数对象(listener)。所有可以发出事件的对象都是EventEmitter类的实例。这些对象公开了一个eventEmitter.on()函数,该函数允许将一个或多个函数绑定到将由对象触发的命名事件。事件名称通常是驼峰式字符串,但可以使用任何有效的JavaScript属性名称。当EventEmitter对象发出事件时,所有绑定到该事件的函数都会被同步调用。侦听器的返回值被丢弃。2.Events模块API介绍3.一些例子下面是一些简单的例子,对应上面API的一个代码实现3.1绑定和触发事件constEventEmitter=require('events');//自定义一个继承自EventEmitterclassMyEmitter的对象extendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.on('event',()=>{console.log('事件被触发!');});myEmitter.emit('event');3.2事件传递参数constEventEmitter=require('events');classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.on('event',(a,b)=>{console.log(a,b);//1,2});myEmitter.emit('事件','a','b');3.3this的问题当一个普通的监听器函数被EventEmitter调用时,标准的this关键字会被设置为指向监听器所依附的EventEmitter。constEventEmitter=require('events');classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.on('event',function(){console.log(this);/*abMyEmitter{域:null,_events:{event:[Function]},_eventsCount:1,_maxListeners:undefined}*/});myEmitter.emit('事件');ES6箭头函数也可以用作监听器。但是这个关键字不再指向EventEmitter实例:constEventEmitter=require('events');classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.on('event',()=>{console.日志(这个);//{}});myEmitter.emit('事件');3.4异步执行EventListener会按照监听器注册的顺序同步调用所有的监听器。监听函数可以使用setImmediate()或process.nextTick()方法切换到异步操作模式:constEventEmitter=require('events');classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.on('event',(a,b)=>{setImmediate(()=>{//异步触发console.log(a,b);})console.log("c");});myEmitter.emit('event','a','b');//c//ab3.5无限次触发,一个触发事件默认可以无限次触发。只要触发一次,对应的监控函数就会执行一次;有时我们希望只执行一次监听函数,可以使用[once]绑定事件触发多次:constEventEmitter=require('events')classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();letm=0;myEmitter.on('event',()=>{console.log(++m);});myEmitter.emit('event');//1myEmitter.emit('事件');//2我的发射器。发出('事件');//3触发一次:constEventEmitter=require('events')classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();letm=0;myEmitter.once('event',()=>{console.log(++m);});myEmitter.emit('事件');//1myEmitter.emit('事件');//忽略myEmitter.emit('event');//忽略3.6错误事件当EventEmitter实例发生错误时,将触发'error'事件。如果EventEmitter没有为'error'事件注册至少一个监听器,当'error'事件被触发时,将抛出错误并打印堆栈跟踪并退出Node.js流程constEventEmitter=require('events');classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.emit("error",newError('whoops!'));//抛出错误并创建Node.jscrash为了防止Node.js进程崩溃,可以在进程对象的uncaughtException事件上注册一个监听器constEventEmitter=require('events')classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();//在进程上面注册错误监控,这样进程就不会崩溃("whoops"))上面的方法不是最好的做法,最好注册[error]的监听函数3.7获取并修改最大事件监听数节点默认一个事件的监听数为10,并且如果超过10个,将发出警告//10for(leti=0;i<11;i++){myEmitter.on("event",()=>{console.log(i);});}myEmitter.emit("event")//MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个事件侦听器。使用emiter.setMaxListeners()增加限制改变指定EventEmitter实例的监听器限制constEventEmitter=require('events')classMyEmitterextendsEventEmitter{}constmyEmitter=newMyEmitter();myEmitter.setMaxListeners(13);for(leti=0;i<11;i++){myEmitter.on("event",()=>{console.log(i);});}myEmitter.emit("event")3.8newListener事件EventEmitter实例将in一个监听器被添加到它的内部监听器数组[before]触发它自己的'newListener'事件(event,listener)=>{if(event==="event"){myEmitter.on("event",()=>{console.log("B");})}});myEmitter.on("event",()=>{console.log("A");});myEmitter.emit("event")/*BA*/CSDN【节点事件模块Events】同步更新

最新推荐
猜你喜欢