Event Loop and EventEmitter

Event Loop

  • Node.js에선 Event를 매우 많이 사용하고, 이 때문에 다른 기술들보다 훨씬 속도가 빠름

  • Node.js 기반으로 만들어진 server가 가동되면,

    • 변수들을 initialize하고,

    • 함수선언하고,

    • Event가 일어날 때 까지 기다림

  • Event-Driven application에서는 event를 대기하는 main loop가 있음

    • 그리고 event가 감지되었을 시 Callback 함수 를 호출함

Event vs Callback Function

  • Callback function은 비동기식 함수에서 결과를 반환할 때 호출

  • Event Handlingobserver pattern에 의해 작동됨

Observer pattern

  • object의 상태 변화를 관찰하는 관찰자들, 즉 observer들의 목록을 object에 등록하여 상태 변화가 있을 때마다 method 등을 통해 객체가 직접 목록의 각 observer에게 통지하도록 하는 design pattern

  • 주로 Distributed event handling system 을 구현하는 데 사용됨

이벤트를 대기하는 EventListeners 함수들이 observer 역할을 함!

-> Observer들이 event를 기다리다가, event가 실행되면 event를 처리하는 함수가 실행됨!

events module & EventEmitter Class

: Node.js의 event moduleEventEmitter Class 를 사용하여 eventevent handler를 bind 할 수 있다

사용 방법

// events module 사용
var events = require('events')

// EventEmitter object 생성
var eventEmitter = new events.EventEmitter();

// Bind event & EventHandler
eventEmitter.on('eventName', eventHandler);

// Program 안에서 event를 발생시키기
eventEmtter.emit('eventName');

ex)

event_handle.js

// events module 사용
var events = require('events');

// EventEmitter object 생성
var eventEmitter = new events.EventEmitter();

// EventHandler 함수 생성
var connectHandler = function connected(){
    console.log("You've connected");

    // data_received event 발생시키기
    eventEmitter.emit('data_received');
}

// connection event와 connectHandler 를 연동
eventEmitter.on('connection', connectHandler);

// data_received event와 anonymous function 연동
// -> 함수를 변수안에 담는 대신에, .on() method의 인자로 직접 함수를 전달
eventEmitter.on('data_received', function() {
    console.log('Data received');
}) 

// connection event 발생 시키기
eventEmitter.emit('connection');

console.log('Program has ended');

Result

$ node event_handle.js 
You've connected
Data received
Program has ended

EventEmitter Class

  • Many objects in a Node emit events

    • Server emits an event each time a peer connects to it

    • An fs.readStream emits an event when the file is opened

  • All objects which emit events are instance of events.EventEmitter

Methods

Class Methods

Events

ex)

EventEmitter.js

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
   console.log('listner2 executed.');
}

// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);

var eventListeners = require('events').EventEmitter.listenerCount
   (eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

// Fire the connection event 
eventEmitter.emit('connection');

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// Fire the connection event 
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program Ended.");

Result

$ node EventEmitter.js 
2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.

Last updated