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

[每天一包0025]events

时间:2023-04-03 12:40:58 Node.js

[github地址:https://github.com/ABCDdouyae...]events事件触发大多数Node.js核心API都建立在通常的异步事件驱动架构上,其中之一其中某些类型的对象(也称为触发器,Emitter)会触发命名事件来调用函数(也称为监听器,Listener)。所有可以发出事件的对象都是EventEmitter类的实例。这些对象有一个eventEmitter.on()函数,它将一个或多个函数绑定到命名事件。事件名称通常是驼峰式字符串。当EventEmitter对象触发一个事件时,所有绑定到该事件的函数都会被同步调用。基本用法:实例化一个监听器,注册监听事件'event',当'event'被emit触发时,回调会被调用=newMyEmitter();myEmitter.on('事件',()=>{console.log('触发事件')});myEmitter.emit('事件');eventEmitter.emit()方法可以将任意数量的参数传递给侦听器函数。当调用监听器函数时,this关键字将指向监听器绑定的EventEmitter实例。myEmitter.on('event1',function(a,b){console.log(a,b,this)//12MyEmitter{}});myEmitter.emit('event1',1,2);也可以使用ES6箭头函数作为监听器。但是这个关键字不会指向EventEmitter实例:myEmitter.on('event',(a,b)=>{console.log(a,b,this);//print:ab{}});myEmitter.发出('事件','a','b');使用eventEmitter.once()注册最多可以调用一次的侦听器。当事件被触发时,侦听器将被取消注册,然后再次调用。letm=0;myEmitter.once('event',()=>{console.log(++m);});myEmitter.emit('event');//print:1myEmitter.emit('event');//不触发'error'事件应该在EventEmitter实例失败时触发。如果没有为'error'事件注册侦听器,当'error'事件触发时,将抛出错误,打印堆栈跟踪,然后Node.js进程退出myEmitter.emit('error',newError('errormessage'));//Throwingerrors作为最佳实践,监听器应该总是注册'error'事件。myEmitter.on('error',(err)=>{console.error('errormessage');});myEmitter.emit('error',newError('errormessage'));//打印:错误信息EventEmitter类由事件模块定义:constEventEmitter=require('events');添加监听器时,将触发'newListener'事件;当删除现有侦听器时,将触发“removeListener”事件。newListener的参数是添加的监听事件和事件处理函数myEmitter.once('newListener',(event,listener)=>{console.log(event,listener)//'event1'fn});functionfn(){console.log(1)}myEmitter.on('event1',fn)在添加监听器之前触发'newListener'事件有副作用:如果在回调中注册了同名事件的监听器,侦听器将在添加侦听器之前插入。constmyEmitter=newMyEmitter();//只处理一次以避免死循环。myEmitter.once('newListener',(event,listener)=>{if(event==='event'){//在之前插入一个新的监听器。myEmitter.on('event',()=>{console.log('B');});}});myEmitter.on('event',()=>{console.log('A');});myEmitter.emit('event');//Print//B//AremoveListener的参数是移除的监听事件和事件处理函数EventEmitter.defaultMaxListeners默认每个事件最多可以注册10个监听器。可以使用emitter.setMaxListeners(n)方法更改单个EventEmitter实例的限制。可以使用EventEmitter.defaultMaxListeners属性更改所有EventEmitter实例的默认值。谨慎设置EventEmitter.defaultMaxListeners,因为它会影响所有EventEmitter实例,包括之前创建的实例。因此,优先使用emitter.setMaxListeners(n)而不是`EventEmitter.defaultMaxListeners。限制并非一成不变。EventEmitter实例可以添加超过限制的侦听器,但会向stderr输出跟踪警告,指示检测到可能的内存泄漏。对于单个EventEmitter实例,可以使用emitter.getMaxListeners()和emitter.setMaxListeners()console.log(myEmitter.getMaxListeners())//10myEmitter.setMaxListeners(11);functionfn(){console.log暂时抑制警告。log(1)//111}for(vari=0;i<11;i++){myEmitter.on('event1',fn)}myEmitter.emit('event1')emitter.addListener(eventName,listener),emitter.on(eventName,listener)emitter.emit(eventName[,...args])的别名按照监听器注册的顺序同步调用注册到名为eventName的事件的每个监听器,并传入提供的参数。如果事件有侦听器,则返回true,否则返回false。emitter.eventNames()返回已注册侦听器的事件名称数组。数组中的值是字符串或`Symbols。constEventEmitter=require('事件');constmyEE=newEventEmitter();myEE.on('foo',()=>{});myEE.on('bar',()=>{});constsym=Symbol('symbol');myEE.on(sym,()=>{});console.log(myEE.eventNames());//打印:['foo','bar',Symbol(symbol)]emitter.getMaxListeners()返回EventEmitter中当前最大监听器数量的值emitter.listenerCount(eventName)返回正在监听名为eventName的事件的监听器数量。emitter.listeners(eventName)返回名为eventName的事件的侦听器数组的副本。让fn1=()=>{},fn2=()=>{};myEmitter.on('foo',fn1);myEmitter.on('foo',fn2);console.log(myEmitter.listeners('foo'));//[[函数:fn1],[函数:fn2]]emitter.off(eventName,listener),emitter.removeListener()的别名。emitter.prependListener(eventName,listener)将侦听器函数添加到名为eventName的事件的侦听器数组的开头。不检查是否已添加侦听器。使用相同的eventName和listener多次调用它会导致多次添加listener。emitter.prependOnceListener(eventName,listener)将一次性侦听器侦听器添加到名为eventName的事件的侦听器数组的开头。下次触发eventName事件时,会先移除监听器,然后再调用。emitter.removeAllListeners([eventName])移除指定eventName事件的所有监听器或监听器。emitter.removeListener(eventName,listener)从名为eventName的事件的侦听器数组中删除指定的侦听器。letfn1=()=>{console.log(1)},fn2=()=>{console.log(2)};//2myEmitter.on('foo',fn1);myEmitter.on('foo',fn2);console.log(myEmitter.listeners('foo'));//[[[函数:fn1],[函数:fn2]]myEmitter.off('foo',fn1);myEmitter.emit('foo');emitter.setMaxListeners(n)默认情况下,如果为特定事件添加了超过10个侦听器,则EventEmitter将打印警告。这有助于发现内存泄漏。但是,并非所有事件都限制为10个听众。emitter.setMaxListeners()方法可以修改指定EventEmitter实例的限制。Infinity(或0)的值意味着无限数量的听众。emitter.rawListeners(eventName)返回eventName事件的侦听器数组的副本,包括包装的侦听器(例如由.once()创建的侦听器)。constemitter=newEventEmitter();emitter.once('log',()=>console.log('Onlylogonce'));//返回一个包含封装了`listener`方法的监听器的数组。constlisteners=emitter.rawListeners('log');constlogFnWrapper=listeners[0];//打印“仅记录一次”,但不解除绑定“一次”事件。logFnWrapper.listener();//打印“只记录一次”并移除监听器。logFnWrapper();emitter.on('log',()=>console.log('loggingcontinuously'));//返回一个仅包含由`.on()`绑定的侦听器的数组。constnewListeners=emitter.rawListeners('log');//打印两次“连续记录”。newListeners[0]();emitter.emit('log');