커스텀 이벤트를 정의하고 이벤트를 발생시키는 방법에 대해 알아보자.
const EventEmitter = require('events');
const emitter = new EventEmitter();
const callback = () => {
console.log('first callback - ', args);
}
// on - 이벤트 정의
// hi라는 이벤트 발생시 콜백함수 정의
emitter.on('hi', callback);
// 중복정의 가능, 뒤이어서 동작
emitter.on('hi', (args) => {
console.log('second callback - ', args);
});
// emit - 이벤트 발생
// hi 이벤트 발생
emitter.emit('hi', { message: 1 });
emitter.emit('hi', { message: 2 });
// emitter에 존재하는 모든 리스너, 즉 모든 이벤트의 콜백을 제거
emitter.removeAllListeners();
// emitter에 hi 이벤트의 callback라는 콜백을 제거
emitter.removeListener('hi', callback);
emitter.emit('hi', { message: 3 });
이번에는 EventEmitter 활용예제를 보도록하자.
로거라는 EventEmitter를 클래스를 생성해보자. 해당 로거 Emitter의 역할은 콜백의 실행전과 후에 로그를 찍어주는 역할을 한다.
const EventEmitter = require('events');
class Logger extends EventEmitter {
log(callback) {
this.emit('log', 'started...');
callback();
this.emit('log', 'ended!');
}
}
module.exports.Logger = Logger;
const logger = require('./logger.js');
const emitter = new logger.Logger();
emitter.on('log', (event) => {
console.log(event);
});
emitter.log(() => {
console.log('-----loop-----');
for (let i = 0; i < 5; i++) {
console.log('count', i);
}
});
주의해야할 점은 EventEmitter은 한번 객체를 생성하면 해당 객체에서 발생된 이벤트에 대해서만 리스닝을 할 수 있다.
즉, 서로다른 EventEmitter의 객체는 개별적인것이다.
따라서 클래스로 작성하여 하나의 객체로 관리 해주어야 올바르게 활용할 수 있다.