Event Emitter와 이벤트 큐, 핸들러
Event Emitter
Node.js가 제공하는 events 모듈을 통해 상호작용 처리
프로그램의 여러 부분이 메시지를 보내고 받음으로써 서로 통신할 수 있는 편리한 도구
EventEmitter 클래스를 상속받은 객체를 만들고, on() 메서드를 통해 이벤트 리스너를 등록하면 이벤트가 발생할 때마다 등록한 콜백함수가 실행된다.
const EventEmitter = require('events');
const myEmitter = new EventEmitter();
이벤트를 발생시키고, 해당 이벤트에 대한 콜백이 실행되는 연산은 하나의 EventEmitter 객체 내에서만 이루어진다. EventEmitter 객체가 발생시키는 이벤트는 해당 객체 내에서만 유효하다.
메소드
- on()
어떤 이벤트가 발생했을 때, 실행할 콜백을 등록하는 메소드
myEmitter.on('start', () => { //start 이벤트 발생시 콜백
console.log('started');
});
- emit ()
인위적으로 이벤트를 발생시키는 메소드
myEmitter.emit('start');
이벤트를 emit 한다는 것은 발생시킨다는 의미이며, Event Listener나 Handler는 발생한 이벤트를 인지하고 처리하는 역할을 하게된다.
Event Loop
javascript 는 단일스레드로 call stack이 하나. 작업이 하나만 동시에 이루어짐.
Web API 는 브라우저에서 제공하는 API 비동기로 동작하는 핵심요소는 브라우저에서 제공한다.
브라우저는 Web APIs, Event Table, Callback Queue, Event Loop 등으로 구성
Memory Heap : 메모리 할당 발생
Call Stack : 실행된 코드의 환경을 저장하는 자료구조, 함수 호출 시 Call Stack에 push
Callback queue : 비동기적으로 실행된 콜백함수가 보관 되는 영역
- Event Loop의 역할
1. Call Stack과 Callback Queue를 감시
2. Call Stack이 비어있을 경우, Callback queue에서 콜백함수를 꺼내 Call Stack에 추가
Call Stack에서 실행된 비동기 함수는 Web API를 호출하고, Web API는 콜백함수를 Callback Queue에 밀어 넣는다
.
- Web API와 Call Stack 동작 방식
setTimeout 함수가 실행되면서 Browser가 제공하는 timer Web API 를 호출한다. 그 후 Call Stack에서 제거
- 이벤트 루프 동작을 시각적으로 설명해주는 사이트
setTimeout 함수에 전달한 0ms 시간이 지난뒤 Callback으로 전달한 cb 함수가 Callback Queue에 추가된다.
Event Loop는 Call Stack이 비어있는 것을 확인하고 Callback Queue를 확인한다. cb를 발견한 Event Loop는 Call Stack에 cb를 추가한다.
- setInterval
setInterval(() => {
eventLoop.run();
}, 1000);
- super()
부모-class의 생성자(constructor)를 참조한다. 코드의 재사용을 줄일 수 있다
References
이벤트 루프
https://velog.io/@thms200/Event-Loop-이벤트-루프
https://medium.com/sjk5766/javascript-비동기-핵심-event-loop-정리-422eb29231a8
https://medium.com/sessionstack-blog/how-does-javascript-actually-work-part-1-b0bacc073cf
event emmiter
https://nodejs.org/en/learn/asynchronous-work/the-nodejs-event-emitter
https://velog.io/@ktaewon98/Node-EventEmitter-객체에-대해서
https://www.linkedin.com/pulse/what-event-emitter-nodejs-korvage-vz5yf
https://blog.naver.com/jdub7138/221034236810
https://noodabee.tistory.com/entry/Nodejs-EventEmitter란-feat-Promise와의-차이점
queue 구현
https://velog.io/@longroadhome/자료구조-JS로-구현하는-.큐-Queue
문자열을 숫자배열로 반환 split,map