[Node.js] event
[Node.js] event
이벤트
노드는 이벤트를 기반으로 하는 비동기 방식으로 처리한다. 비동기 방식으로 처리하기 위해 서로 이벤트를 전달해야한다.
노드에는 이런 이벤트를 전달할 수 있는 EventEmitter
를 통해 이벤트를 주고 받는다.
NOTE: 이벤트는 한쪽에서 다른쪽으로 이벤트가 발생했음을 알려주는 것으로 다른쪽에서 이벤트를 받기 위해 Event Listener
를 등록해야 한다.
웹에서 JavaScript로 작업한 경우 마우스 클릭, 키보드 버튼, 마우스 움직임에 따라 사용자와 상호작용하는 웹을 만들 수 있는데,
Node.js의 event
모듈은 유사한 기능을 구현할 수 있도록 도와준다.
이벤트 전달
노드 객체는 EventEmitter
를 상속받아 on()
과 emit()
메소드를 사용할 수 있다.
메소드 | 설명 |
---|---|
on(event, listener) | 이벤트의 리스너에 추가 |
once(event, listener) | 이벤트의 리스너에 추가하지만 한 번 실행 후 제거 |
removeListener(event, listener) | 이벤트 리스너 제거 |
emit(event, parameter) | 이벤트 트리거 |
process
객체는 내부적으로 EventEmitter
를 상속 중이기 때문에 바로 on()
과 emit()
메소드를 사용가능하다.
process.on('start', function(count){
console.log('start 이벤트 발생');
});
setTimeout(function(){
console.log('2초 뒤에 start 이벤트 전달');
process.emit('start');
}, 2000);
Timeout {
_idleTimeout: 2000,
_idlePrev: [TimersList],
_idleNext: [TimersList],
_idleStart: 12913,
_onTimeout: [Function (anonymous)],
_timerArgs: undefined,
_repeat: null,
_destroyed: false,
[Symbol(refed)]: true,
[Symbol(kHasPrimitive)]: false,
[Symbol(asyncId)]: 9,
[Symbol(triggerId)]: 6
}
2초 뒤에 start 이벤트 전달
start 이벤트 발생
객체를 모듈로
항상 process
객체를 사용해 이벤트를 전달한다면 같은 이름의 이벤트를 사용하는 경우 충돌이 발생할 수 있다.
때문에 별도의 모듈 파일을 만들고 그 안에서 이벤트를 처리하도록 만드는 것이 좋다.
//계산기 객체 모듈 ./calc.js
var util = require('util');
var EventEmitter = require('events').EventEmitter;
var Calc = function(){
var self = this;
this.on('stop', function(){
console.log('Calc에 stop event 전달');
});
};
util.inherits(Calc, EventEmitter);
Calc.prototype.add = function(a,b){
return a+b;
}
module.exports = Calc;
module.exports.title = 'calculator';
Calc 객체는 function
을 사용해 프로토타입 객체로 만든다. 프로토타입 객체 안에서 this
를 통해 자신을 가르켜 객체안에 정의된 속성에 접근한다.
util.inherits()
메소드를 이용해 Calc
객체가 EventEmitter
를 상속하게 한다.
아래 코드는 위에서 만들어진 모듈을 사용하는 코드이다.
var Calc = require('./calc');
var calc = new Calc();
calc.emit('stop');
console.log(Calc.title + '에 stop 이벤트 전달');
Calc에 stop event 전달
calculator에 stop 이벤트 전달
Leave a comment