이벤트(EVENT)

이벤트를 연결하는 것을 포함해 직접 생성하는 방법에 대해 알아보자.

[목차]


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일 확인 기준)

해결 방법은 아직 찾지 아... 귀찮... 쭈글 ㅠㅠ 못했다.

results matching ""

    No results matching ""