Node.js에는 EventEmitter
라는것이 존재한다. EventLoop
는 Node.js의 비동기, Non-Blocking Stream을 처리하는 핵심 부분이 된다. EventEmitter
를 사용하기 위해서는 events
모듈을 사용하면 된다. 기본적으로 EventEmitter
인스턴스를 만든 후 이벤트 관리 메소드를 사용한다.
import * as event from 'events'
const new_event = new event.EventEmitter();
이 인스턴스는 이벤트를 관리하기 위한 메소드를 가지고 있다. 메소드들의 목록을 살펴보자.
메소드 | 기능 |
---|---|
on(이벤트명, 콜백) | 이벤트 이름과 이벤트 발생시의 콜백을 연결한다. 이렇게 연결하는 동작을 이벤트 리스닝이라고 한다. |
emit(이벤트명) | 이벤트를 호출하는 메소드이다. 이벤트 이름을 인수로 넣으면 미리 등록한 이벤트 콜백이 실행된다 |
once(이벤트명, 콜백) | 한번만 실행되는 이벤트이다. 한번 이상 호출해도 콜백 호출이 이루어지지 않는다. |
removeAllListeners(이벤트명) | 이벤트에 연결된 모든 이벤트 리스너를 제거한다. |
removeListener(이벤트명,리스너) | 이벤트에 연결된 리스너를 하나씩 제거한다. 리스너를 꼭 같이 넣어주어야 한다 |
listenerCount(이벤트명) | 현재 리스너가 몇개 연결되어있는지 확인한다. |
new_event.on('event1', () => {
console.log('event1 called')
})
new_event.on('event2', () => {
console.log('event2 called')
})
new_event.emit('event1');
new_event.emit('event2');
/*
event1 called
event2 called
*/
on()
을 통해 이벤트를 등록한다. 위 예시에 있듯이 두번째 매개변수로는 등록한 이벤트 발생시 실행할 콜백함수를 넘겨준다.
emit()
을 사용해서 등록된 이벤트를 발생시킨다. 위 예시에서 event1
과 event2
를 매개변수로 넘겨줘 이벤트를 발생시키는것을 볼 수 있다.
만약에 콜백에 매개변수를 넘겨주어야한다고 가정해보자. 그런 경우에는 emit()
메소드의 첫번째 매개변수에는 이벤트의 이름을, 두번째 매개변수부터 콜백함수의 매개변수들을 넘겨주면 된다.
new_event.on('event3', (param1: number, param2: number) => {
console.log(`${param1} + ${param2} = ${param1 + param2}`)
})
new_event.emit('event3', 10, 20)
//10 + 20 = 30
new_event.once('event_once', () => {
console.log('only call once')
})
new_event.emit('event_once')
new_event.emit('event_once')
//only call once
once()
메소드로 이벤트와 해당 콜백을 정의한 후 여러번 emit()
메소드를 호출하더라도 한번만 호출되는것을 볼 수 있다.
console.log(`Before remove : ${new_event.listenerCount('event1')}`)
new_event.removeAllListeners()
console.log(`After remove : ${new_event.listenerCount('event1')}`)
new_event.emit('event1');
new_event.emit('event2');
new_event.emit('event3', 10, 20);
new_event.listenerCount('event1')
우선 removeAllListeners()
를 호출하기 전 후에 event1
에 연결된 이벤트들의 개수를 출력하는 코드를 작성한다.
removeAllListeners()
메소드를 호출하여 EventEmitter객체에 연결된 모든 이벤트들을 해제한다. 그 후 위에서 정의한 이벤트들을 emit()
메소드를 통해 이벤트를 발생시켜도 아무런 반응을 하지 않는것을 볼 수 있다.
listenerCount()
메소드를 보면 특정 이벤트에 대해 등록된 콜백의 개수를 확인할 수 있는것을 볼 수 있다.이 말은 즉, 하나의 이벤트에는 여러개의 콜백을 등록할 수 있다는 소리이며, 해당 이벤트 이름으로 이벤트를 발생시키면, 해당 이벤트에 등록된 콜백이 모두 실행되게 된다. 매개변수가 있는 콜백이 있다면 다른 매개변수가 없는 콜백 상관 없이 넘겨줄 수 있다.
new_event.on('event4', () => {
console.log("event4's event1")
})
new_event.on('event4', (a, b) => {
console.log("event4's event2")
console.log("a, b : ", a, b)
})
new_event.on('event4', () => {
console.log("event4's event3")
})
new_event.emit('event4', 10, 20)
console.log("Event4's event count : ", new_event.listenerCount('event4'))
/*
event4's event1
event4's event2
a, b : 10 20
event4's event3
Event4's event count : 3
*/