Node.js 'Event'

2019. 11. 14. 01:56·Web/Nodejs

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는 다음과 같은 형태로 도식화할 수 있다.

출처 : https://medium.com/unlearninglabs/how-to-code-your-own-event-emitter-in-node-js-a-step-by-step-guide-e13b7e7908e1


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에 저장됨.

 

정리

  1. event.on || event.addListener 에 등록된 Listener 순서대로 모두 호출된다.
  2. 각 event 이름에 해당하는 object function array를 갖는다. //  1번 규칙칙을 따라 모두 호출됨
  3. 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
'Web/Nodejs' 카테고리의 다른 글
  • Nodejs Module 'http'
  • node.js global 'exports'
  • Test를 위한 모듈 'assert'
  • module과 export
M_Falcon
M_Falcon
  • M_Falcon
    Falcon
    M_Falcon
  • 전체
    오늘
    어제
    • 분류 전체보기 (432)
      • Web (16)
        • Nodejs (14)
        • Javascript (23)
        • FrontEnd (4)
      • DataBase (39)
        • Fundamental (1)
        • Redis (4)
        • PostgreSQL (10)
        • NoSQL (4)
        • MySQL (9)
        • MSSQL (3)
        • Error (4)
      • Algorithm (79)
        • Algorithm (문제풀이) (56)
        • Algorithm (이론) (23)
      • JVM (65)
        • Spring (13)
        • JPA (5)
        • Kotlin (13)
        • Java (24)
        • Error (7)
      • 기타 (70)
        • Kafka (3)
        • Kubernetes (3)
        • Docker (13)
        • git (19)
        • 잡동사니 (27)
      • 재테크 (11)
        • 세무 (4)
        • 투자 (3)
        • 보험 (0)
      • BlockChain (2)
        • BitCoin (0)
      • C (32)
        • C (10)
        • C++ (17)
        • Error (3)
      • Low Level (8)
        • OS (3)
        • 시스템 보안 (5)
      • 네트워크 (3)
      • LINUX (30)
        • Linux (26)
        • Error (4)
      • 저작권과 스마트폰의 이해 (0)
      • 생각 뭉치 (6)
      • 궁금증 (2)
      • Private (4)
        • 이직 경험 (0)
        • 꿈을 찾아서 (1)
      • Android (21)
        • OS (4)
  • 블로그 메뉴

    • 홈
    • WEB
    • 알고리즘
    • DataBase
    • Linux
    • Mobile
    • C
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    kafka
    프로그래머스
    Programmers
    database
    Kotlin
    JPA
    docker
    ubuntu
    java
    algorithm
    Bitcoin
    Git
    javascript
    C++
    알고리즘
    linux
    백준
    PostgreSQL
    android
    Spring
  • hELLO· Designed By정상우.v4.10.3
M_Falcon
Node.js 'Event'
상단으로

티스토리툴바