Node.js는 기본적으로 Event라는 Module,
EventEmitter라는 Class를 내장하고있다.
Event관련 메소드들
EventHandler: function to be executed when specific Event triggers
1. Event Method
메소드 | 설명 |
eventEmitter.on(EventName, EventListner) | 이벤트 이름에 따라 취할 액션을 이벤트 리스너(핸들러)에 등록하는 메소드 (on == addListener) |
eventEmitter.once('EventName', EventListner) |
한번 만 수행할 액션을 이벤트 리스너로 등록 |
eventEmitter.removeListner(EventName, EventLister) | on으로 등록해둔 이벤트 삭제.(취소) |
eventEmitter.emit('EventName') | report the detection of Event |
※참고※ 위 메소드들의 Return Type은 Boolean (True/False)
결국 'on'이 이벤트 등록
'emit'이 이벤트 발생인데, 공식 문서를 살펴보면 이벤트 등록메소드 'on'에 대해 다음과 같이 설명되어있다.
Adds the listener function to the end of the listeners array for the event named eventName. No checks are made to see if the listener has already been added. Multiple calls passing the same combination of eventName and listener will result in the listener being added, and called, multiple times.
=> 등록시 리스너 배열의 맨끝에 추가하고, 중복성 검사는 수행되지 않는다. 즉, 같은 이벤트 이름에 리스너를 여러번 등록해도 모두 리스너 배열이 추가되고 호출된다.
2. 예제
const events = require('events')
const eventEmitter = new events.EventEmitter();
// event 에 여러개의 listener function(EventListener)을 정의할 수 있고
// 이 함수들은 function object array 에 저장된다.
// event 발생시 listener function(EventListener)가 호출될 때, 위의 배열을 순서로 호출하게된다.
//event.on(eventName, Listener)
// test functino object에 이벤트 3개의 EventListener 함수 등록.
const firstPrint = ()=>{console.log('this is first');}
const secondPrint = ()=>{console.log('this is second');}
const sum = (a, b)=>{
console.log(a + b);
}
eventEmitter.on('test', sum)
eventEmitter.on('test', firstPrint);
eventEmitter.on('test', secondPrint);
eventEmitter.addListener('ysu', (name="", age= 25)=>{
console.log(`name: ${name}, age: ${age}`);
})
// on == addListener
eventEmitter.on('error', error=>{
console.log("this is fuckin' event");
console.error(error);
});
// 등록된 이벤트 이름들 모두 배열로 반환
console.log(eventEmitter.eventNames());
// 이벤트 이름에 등록된 함수 목록 배열로 반환
console.log(eventEmitter.listeners('test'));
eventEmitter.emit('test', 'a', 'b');
// 이벤트 이름에 대응되는 함수 배열기준 모두 호출.
eventEmitter.emit('test', 3, 5);
console.log(`Max Listener : ${events.defaultMaxListeners}`);
console.log(`lister Count : ${events.listenerCount(eventEmitter, 'test')}`);
출력 결과
3. Listenr array 도식화
'once' 메소드로 등록된 함수는 한번 발생 하면 listeners array에서 호출 이후 삭제된다.
event - listener는 다음과 같은 형태로 도식화할 수 있다.
express의 server, request, response 모두 event 객체다.
event 등록한 listener 함수들은 function object array의 형태로 저장
event.on('first', function(){});
event.on('first', function(a, b){return a+b;});
//=> 'first' 이름 가진 object orray에 저장됨.
정리
- event.on || event.addListener 에 등록된 Listener 순서대로 모두 호출된다.
- 각 event 이름에 해당하는 object function array를 갖는다. // 1번 규칙칙을 따라 모두 호출됨
- C++, JAVA 와 달리 parameter 갯수가 맞지 않아도 모두 호출된다. (method overloading 을 하지 않는다.)
∵ 3번의 경우 Javascript가 강타입 컴파일 언어가 아니라 약타입 스크립트 언어라는 점을 생각해보면 당연하다.
Reference
nodejs.org/api/events.html#events_class_eventemitter
on-ad.github.io/node.js/2019/04/09/Nodejs-EventEmitter.html
stackoverflow.com/questions/38881170/when-should-i-use-eventemitter
medium.com/unlearninglabs/how-to-code-your-own-event-emitter-in-node-js-a-step-by-step-guide-e13b7e7908e1
'Web > Nodejs' 카테고리의 다른 글
express & connect (0) | 2019.12.06 |
---|---|
Nodejs Module 'http' (0) | 2019.12.01 |
node.js global 'exports' (0) | 2019.11.30 |
Test를 위한 모듈 'assert' (0) | 2019.11.28 |
module과 export (0) | 2019.11.16 |