이벤트(EVENT)
이벤트를 연결하는 것을 포함해 직접 생성하는 방법에 대해 알아보자.
[목차]
- Node.js 이벤트 문서 : http://nodejs.org/dist/latest-v4.x/docs/api/events.html
1. 이벤트 연결
이벤트를 연결하면 이벤트가 실행될 때마다 핸들러가 실행된다.
[이벤트 연결 메서드]
메서드 이름 | 설명 |
---|---|
on(eventName, eventHandler) | 이벤트를 연결한다. 연결한 이벤트가 발생하면 핸들러 부분을 실행하게 된다. |
once(eventName, eventHandler) | 이벤트 리스너를 한번만 연결한다. |
[코드 1 - exit 이벤트 연결]
// process 객체에 exit 이벤트를 연결한다.
process.on('exit', function (code) {
// TODO
});
[코드 2 - exit 이벤트 연결 후 실행]
var count = 0;
// exit 이벤트 연결
process.on('exit', function (code) {
count += 1;
if (count == 5) { return console.log('마지막으로 안녕히 계세요~!'); }
console.log(count + ' 번째 안녕히 계세요~!');
});
process.exit();
[실행 2 - exit 이벤트 연결 후 실행]
$ node main.js
1 번째 안녕히 계세요~!
코드 작성 시 주의 해아 할 것은 이벤트 연결이 실행보다 먼저 되어야 한다는 것이다. 위의 코드와 비교해보면 이해가 바로 된다.
[코드 3 - exit 이벤트 실행 후 연결]
var count = 0;
// exit 이벤트 실행
process.exit();
// exit 이벤트 연결
process.on('exit', function (code) {
count += 1;
if (count == 5) { return console.log('마지막으로 안녕히 계세요~!'); }
console.log(count + ' 번째 안녕히 계세요~!');
});
[실행 3 - exit 이벤트 실행 후 연결]
$ node main.js
이렇게 바로 종료가 되어 log가 출력되지 않는다.
2. 이벤트 연결 개수 제한
한 이벤트에 10개가 넘는 리스너를 연결하면 실행시 경고가 발생한다. 경고를 제거하려면 다음 표의 메서드를 사용한다.
[이벤트 연결 개수 제한 메서드]
메서드 이름 | 설명 |
---|---|
setMaxListeners(limit) | 이벤트 리스너 연결 개수를 조절한다. 무한대 연결은 0을 입력한다. |
[코드 1 - 10개가 넘는 이벤트 연결]
// 이벤트 연결
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
[코드 2 - setMaxListeners() 메서드]
// 이벤트 연결 개수 제한을 15개까지 늘린다.
// 무한대로 연결하고 싶다면 0을 입력한다.
process.setMaxListeners(15);
// 이벤트 연결
process.on('exit', function(){});
process.on('exit', function(){});
process.on('exit', function(){});
.
.
.
3. 이벤트 제거
[이벤트 제거 메서드]
메서드 이름 | 설명 |
---|---|
removeListener(eventName, handler) | 특정 이벤트의 리스너를 제거한다. |
removeAllListener([eventName]) | 모든 이벤트의 리스너를 제거한다. |
4. 이벤트 강제 발생
emit() 메서드를 사용해 이벤트를 강제로 호출하면 이벤트 리스너만 실행된다.
[이벤트 강제 발생 메서드]
메서드 이름 | 설명 |
---|---|
emit(eventName[, arg1][, arg2][, ...]) | 이벤트를 실행한다. |
[코드 - 이벤트 강제 발생]
var count = 0;
// exit 이벤트 연결
process.on('exit', function (code) {
count += 1;
if (count == 5) { return console.log('마지막으로 안녕히 계세요~!'); }
console.log(count + ' 번째 안녕히 계세요~!');
});
// 이벤트 강제 발생
for (var i = 1; i < 5 ; i++){
// 강제로 이벤트가 연결된 부분으로 이동된다.
process.emit('exit');
}
// 프로그램 실행중
console.log('프로그램 실행 중');
[실행 - 이벤트 강제 발생]
$ node main.js
1 번째 안녕히 계세요~!
2 번째 안녕히 계세요~!
3 번째 안녕히 계세요~!
4 번째 안녕히 계세요~!
프로그램 실행 중
마지막으로 안녕히 계세요~!
5. 이벤트 생성
Node.js에서 이벤트를 연결할 수 있는 모든 객체는 EventEmitter 객체의 상속을 받는다. 지금까지 예제에서 사용된 process 객체도 EventEmitter 객체의 상속을 받기 때문에 이벤트를 연결할 수 있는 것이다.
[EventEmitter 객체 메서드]
메서드 이름 | 설명 |
---|---|
addListener(eventName, eventHandler) | 리스너를 추가한다. |
on(eventName, eventHandler) | 이벤트를 연결한다. |
setMaxListener(limit) | 이벤트 연결 개수를 조절한다. |
removeListener(eventName, handler) | 특정 이벤트의 이벤트 리스너를 제거한다. |
removeAllListeners([eventName]) | 모든 이벤트의 리스너를 제거한다. |
once(eventName, eventHandler) | 이벤트를 한 번만 연결한다. |
[코드 - EventEmitter 객체의 메서드]
// EventEmitter 객체 생성
var custom = new process.EventEmitter();
// 이벤트 연결
custom.on('tick', function (code) {
console.log('이벤트를 실행합니다.');
});
// 이벤트 강제 발생
custom.emit('tick');
[실행 - EventEmitter 객체의 메서드]
$ node main.js
이벤트를 실행합니다.
(node:72408) DeprecationWarning: process.EventEmitter is deprecated. Use require('events') instead.
위의 결과에서 보다시피 지원 중단 경고가 발생한다. process.EventEmitter은 더 이상 사용되지 않는다.(2017년 7월 25일 확인 기준)
해결 방법은 아직 찾지 아... 귀찮... 쭈글 ㅠㅠ 못했다.