>  기사  >  웹 프론트엔드  >  node.js의 EventEmitter에 대해 자세히 이야기해 보겠습니다.

node.js의 EventEmitter에 대해 자세히 이야기해 보겠습니다.

青灯夜游
青灯夜游앞으로
2022-05-09 21:28:542177검색

이 기사에서는 node의 EventEmitter를 이해하고 비동기 작업, 오류 이벤트 및 EventEmitter 클래스에 대해 간략하게 설명합니다. 모두에게 도움이 되기를 바랍니다.

node.js의 EventEmitter에 대해 자세히 이야기해 보겠습니다.

events(이벤트 트리거)


events는 nodejs의 내장 이벤트 트리거입니다. 이벤트는 요청을 받을 때마다 http.server와 같은 노드의 여러 내장 모듈에서 사용됩니다. . 트리거 이벤트 및 스트림은 이벤트를 기반으로 해당 이벤트를 수신하는 데 사용됩니다. 이벤트를 트리거하는 모든 객체는 EventEmitter 인스턴스입니다. 이러한 객체는 EventEmitter.on('event', callback)을 노출합니다. EventTmitte.on은 일반적으로 이벤트를 등록하는 데 사용되며 EventEmitter.emit는 이벤트를 트리거합니다.

예:

  const events= require('events');
const event=new events();//实例化EventEmitter
event.on('data',(a,b)=>{
    console.log('参数'+a+b)
    console.log(this,'this')
    //注意,如果callback是 箭头函数的话this指向的是全局对象
    //      如果callback是function(){}形式的话,this会绑定到EventEmitter实例上
    console.log('emit触发了data事件')
})
event.emit('data',1,2); //使用emit触发事件

비동기 작업

EventEmitter.on('이벤트 이름', 콜백)의 콜백이 동기적으로 실행되기 때문에 어떤 경우에는 비동기 작업을 사용해야 하기 때문에 사용할 수 있습니다. 비동기 작업을 수행하려면 SetImmediate

 const events= require('events');
const event=new events();
event.on('event', (a, b) => {
    
  setImmediate(() => {
    console.log('this happens asynchronously');
  });
  //因为这里的监听器是同步执行的,但是我们可以使用setImediate函数等待监听器里的其他内容执行完再执行
});
event.emit('event',1,2);

Trigger 한 번

일반적으로 내보내기를 통해 이벤트를 트리거할 때 여러 이벤트가 있으면 내보내기가 여러 번 트리거되지만 한 번을 사용하여 이벤트를 등록하고 한 번 사용하여 Trigger it 이벤트는 한 번만 트리거될 수 있습니다

  const EventEmitter =require('events');
  const MyEventEmitter=new EventEmitter();
  let a=0;
  //正常注册事件和触发
  MyEventEmitter.on('add',()=>{
      a++
      console.log(a) 
  })
  MyEventEmitter.emit('add'); // 1;
  MyEventEmitter.emit('add'); // 2;
  // 使用once注册
  MyEventEmitter.once('add',()=>{
      a++
      console.log(a);
  })
  MyEventEmitter.emit('add') // 1
  MyEventEmitter.emit('add') // 不生效了

error event

EventEmitter에는 오류 이벤트가 없으므로 오류가 발생하면 강제로 실행을 종료해야만 하므로 오류 이벤트를 등록해야 합니다. 오류가 발생하면 오류 이벤트가 발생하도록 합니다

 const EventEmitter=require('events');
 const MyEventEmitter=new EventEmitter();
 MyEvenEmitter.on('error',(err)=>{
   console.error(err,'报错了')
 })

위의 방법 외에도 errorMonitor를 사용하면 오류 이벤트를 등록하지 않고 내보내기로 발생하는 오류를 모니터링할 수도 있습니다. errorMonitor를 사용하면 더 이상 오류 이벤트를 수동으로 등록할 필요가 없습니다

  const {EventEmitter,errorMonitor}=require('events');
  const MyEventEmitter=new EventEmitter();
  MyEventEmitter.on(errorMonitor,(err)=>{
      console.log(err);
  })
  MyEventEmitter('error' , new Error('报错了'))

EventEmitter 클래스

newListener event

이벤트 수신을 추가하면 newListener 이벤트가 트리거되므로 newListener 이벤트를 등록할 수 있습니다. 이벤트 리스너를 추가할 때 할 일

 const {EventEmitter}=require('events');
  const MyEvent=new EventEmitter();
  MyEvent.on('newListener',(name,litener)=>{
      //name就是正在监听的事件的名称
      //listener是事件的处理函数
      MyEvent.on('event',()=>{
        console.log('在newListener添加的事件')
      })  
  })
  MyEvent.on('event',()=>{
      console.log('正常注册的event事件')
  })
  //此时我们再不触发event事件的情况下,newListener事件就会执行,因为我们只要正在注册事件就会触发newListener事件
  //注意:newListener事件必须要使用EventEmitter.once()注册,因为如果我们在newListener事件里再去添加注册事件的话,而且外边有多个注册事件就会触发多次newListener事件,就会发生堆栈溢出
 MyEvent.emit('event');

 //打印的结果
   //    在newListener注册的事件
   //     正常注册的event事件

removeListener event

removeListener 이벤트는 등록된 이벤트를 삭제하는 데 사용되지만, RemoveListener는 Emit

 const callbackB=()=>{
    console.log('B')
}
const callbackA=()=>{
    console.log('A')
    event.removeListener('data',callbackB)
}
event.on('data',callbackA)
event.on('data',callbackB)

event.emit('data'); //在执行callbackA的时候删除了data,但是不会阻止掉下一个emit的触发
event.emit('data'); //在这里的时候才是真正被删除掉了

addListener에 의해 트리거되는 이벤트를 방지하지 않습니다. 기능은 동일합니다.

eventNames

배열을 반환합니다. 배열에는 등록된 모든 이벤트의 이름이 포함되어 있습니다.

 const {EventEmitter} =require('events');
 const MyEvent=new EventEmitter();
 MyEvent.on('data',()=>{});
 MyEvent.on('finish',()=>{});
 console.log(MyEvent.eventNames());
 
 //打印结果
  ['data','finish']

getMaxListeners

등록할 수 있는 최대 이벤트 수를 반환하며, 기본값은 10입니다(10을 초과하는 경우). 경고가 될 것이다 하지만 setMaxListener(20)

const {EventEmitter} =require('events');
 const MyEvent=new EventEmitter();
 console.log(MyEvent.getMaxListener()); //10
 event.setMaxListener(20); 
 console.log(MyEvent.getMaxListener(20));

listenerCount

등록된 이벤트 수 반환

 const {EventEmitter} =require('events');
 const MyEvent=new EventEmitter();
 MyEvent.on('data',()=>{});
 MyEvent.on('data',()=>{});
 MyEvent.on('finish',()={});
 console.log(MyEvent.listenerCount()) // 2
을 통해 수정할 수 있습니다. 더 많은 노드 관련 지식을 보려면

nodejs 튜토리얼을 방문하세요!

위 내용은 node.js의 EventEmitter에 대해 자세히 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제