오디오 solo 재생에 대해 검색을 하던 도중 Emitter에 대해 조금 공부를 해보았습니다!
Nodejs EventEmitter는 nodejs 애플리케이션을 만들다 보면 많이 사용하는 라이브러리 입니다.
EventEmitter와 EventLoop 사이엔 아무런 관계가 없다
EventLoop
EventEmitter
EX)
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
myEmitter.on('myevent', () => console.log('handler1: myevent was fired!'));
myEmitter.on('myevent', () => console.log('handler2: myevent was fired!'));
myEmitter.on('myevent', () => console.log('handler3: myevent was fired!'));
myEmitter.emit('myevent');
console.log('I am the last log line');
// 출력
handler1: myevent was fired!
handler2: myevent was fired!
handler3: myevent was fired!
I am the last log line
EventEmitter는 동기적으로 모든 이벤트 핸들러를 호출하므로 I am the last log line은 모든 리스너 함수가 실행되기 전까지 출력되지 않습니다!
Node.js가 비동기적으로 작동하는 것은 그 내부에 비동기 이벤트를 소화하기 위한 라이브러리(libuv)를 지니고 있기 때문입니다. Node.js의 이벤트 루프는 libuv를 이용해 구현되었으며, 크게 여섯 단계의 페이즈를 순환하고 있습니다. 각 페이즈는 libuv를 통해 커널 혹은 쓰레드 풀에 인계했던 콜백 작업을 실행합니다.
setTimeout, setInterval 등 타이머 작업 혹은 DB 연결, 파일 읽기/쓰기, HTTP 요청 등 모든 비동기 작업들은 libuv를 통해 스케줄링 되었다가 이벤트 루프의 순환 주기에 따라 호출됩니다.
emitter.addListener(event, listener)
- on() 메소드와 같습니다. 이벤트를 생성하는 메소드입니다.
emitter.on(event, listener)
- addListener()과 동일합니다. 이벤트를 생성하는 메소드입니다.
emitter.once(event, listener)
- 이벤트를 한 번만 연결한 후 제거합니다.
emitter.removelistener(event, listener)
- 특정 이벤트의 특정 이벤트 핸들러를 제거합니다.
- 이 메소드를 이용해 리스너를 삭제하면 리스너
배열의 인덱스가 갱신되니 주의해야 합니다.
emitter.removeAllListeners([event])
- 모든 이벤트 핸들러를 제거합니다.
emitter.setMaxListeners(n)
- n으로 한 이벤트에 최대허용 개수를 지정합니다.
- node.js는 기본값으로 한 이벤트에 10개의 이벤트 핸들러를 작성할 수 있는데,
11개 이상을 사용하고 싶다면 n값을 넘겨주면 됩니다.
- n값으로 0을 넘겨주면 연결 개수 제한이 사라집니다.
emitter.emit(eventName[, ...args])
- 이벤트를 발생시킵니다.!