2017. 11. 10. 15:46ㆍJavaScript/NodeJS
Event는 기본적으로 리스너(Listener)에 이벤트를 등록하고 Emitter를 통하여 해당 Listener를 호출 하는 실행 된다.
책을 읽으려 하니 나는 책이 이해가 잘 가지않는...다...
에혀...ㅋㅋ 내가 많이 부족한가 보다...
모 여튼.. 그러하더라도 책에는 Event 를 3가지로 구분하고 있다.
1. 표준 콜백 패턴
함수가 작업을 마친 후 콜백 함수를 호출함으로써 프로그램을 이어가는 방식이다.
var fs = require("fs");
fs.readFile("/etc/passwd", function(err, fileContent) {
if( err ) throw err;
console.log("파일 내용 : " + fileContent);
});
2. 이벤트 이미터 패턴
콜백 패턴은 하나의 함수 실행 후 하나의 이벤트에 대한 처리에는 적합하지만, 함수 실행 후 다수의 이벤트에 대한 처리는 어렵다.
이런 경우 사용하는 패턴이 이벤트 이미터 패턴이다.
var http = require("http");
var options = {
host: "localhost",
port: "8081",
path: "/index.html"
};
var req = http.request(options, function(response) {
response.on("data", (data) => {
console.log("수신된 데이터 : " + data);
});
response.on("end", () => {
console.log( "응답종료" );
});
});
req.end();
위의 예제는 서버의 index파일을 읽어 들여 출력하는 것이다.
위와 같이 함수가 실행된 후 이벤트가 여러번(시작, 전송, 종료 등) 필요할 때 사용되는 패턴이다.
3. 이벤트 타입
내가 이해한것이 맞다면 이것은 사용자가 직접 이벤트를 작성하고 등록하는 형태이다.
작성법은
//events 모듈 로드
var events = require("events");
//EventEmitter 객체 생성
var emitter = new events.EventEmitter();
//event와 EventHandler을 연동(Listener에 등록)
emitter.on("eventName", eventHandler);
//연동되어 있는(Listener에 등록되어 있는) event 실행
emitter.emit("eventName");
다음은 예제이다.
var emitter = new (require('events')).EventEmitter();
emitter.on("event", () => {
console.log("event 실행...");
});
emitter.emit("event");
4. 이벤트 연결(등록)
emitter.addListener(event, listener);
emitter.on(event, listener);
emitter.once(event, listener);
addListener과 on은 동일한 것이다.
이 두가지는 이벤트를 지속하여 연결하고 잇는 것이지만 once 는 한 번 연결 후 제거 된다.
process 객체를 예를 들면 다음과 같다.
process.addListener("exit", () => {
console.log("Exit Event");
});
process.on("exit", (data) => {
console.log("종료코드 : " + data );
});
process.once("uncaughtException", (err) => {
console.log( "exception listener count[2nd] : " + process.listenerCount("uncaughtException") );
console.log( "exit listener count[2nd] : " + process.listenerCount("exit") );
console.log("----------------------------------------------------");
});
console.log( "exception listener count[1st] : " + process.listenerCount("uncaughtException") );
console.log( "exit listener count[1st] : " + process.listenerCount("exit") );
console.log("----------------------------------------------------");
noneistenFunc();
console.log("예외가 발생으로 실행 되지 않음.");
위의 소스를 실행하면 다음과 같다.
exception listner count[1st] : 1
exit listner count[1st] : 2
----------------------------------------------------
exception listner count[2nd] : 0
exit listner count[2nd] : 2
----------------------------------------------------
Exit Event
종료코드 : 0
process.addListener("exit", () => {throw new Error("오류가 발생하였습니다.");});process.on("exit", (data) => {console.log("종료코드 : " + data );});
D:\Develop\Workspace\Neon\NodeJs\event2.js:5throw new Error("오류가 발생하였습니다.");^Error: 오류가 발생하였습니다.at process.addListener (D:\Develop\Workspace\Neon\NodeJs\event2.js:5:8)at emitOne (events.js:121:20)at process.emit (events.js:211:7)
5. 이벤트 제거
emitter.removeListener(event, listener);
emitter.removeAllListener([event]);
등록되어 있는 이벤트를 제거하기 위해 사용된다.
var exitListener = function() {
console.log('프로그램 종료[1st]');
};
// 이벤트 연결
process.on('exit', exitListener);
process.on('exit', ()=> {
console.log("프로그램 종료[2nd]")
});
// 이벤트 제거
process.removeListener('exit',exitListener);
결과 :
프로그램 종료[2nd]
'JavaScript > NodeJS' 카테고리의 다른 글
[NodeJS] File System (0) | 2017.11.16 |
---|---|
[NodeJS] Path (0) | 2017.11.13 |
[NodeJS] 모듈, 캐싱 그리고 exports (0) | 2017.11.08 |
[NodeJS] Callback Function, Blocking Code, Non-Blocking Code (0) | 2017.11.07 |
[NodeJS] 내장모듈 사용 (0) | 2017.11.07 |