# Node.js - events Module & EventEmitter Class

# Node.js - events Module & EventEmitter Class

by jihoon kim

HTML

<h1>Node.js - events Module & EventEmitter Class</h1>
<pre>
EventEmitter는 Node.JS에 내장 옵저버 패턴의 구현

# 참고 : https://www.haruair.com/blog/3396
       : https://nodejs.org/dist/v5.5.0/docs/api/events.html

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

    var connectHandler = function connected(){
        console.log("Connection Successful");
        eventEmitter.emit("data_received");
    }
    eventEmitter.on('connection', connectHandler);

    eventEmitter.on('data_received', function(){
        console.log("Data Received");
    });

    eventEmitter.emit('connection');
    console.log("Program has ended");

2. 실행
    $ node event_emitter.js

# 다음은 EventEmitter 인스턴스를 단일 리스너와 함께 작성한 예다.
   1.         eventEmitter.on() 메소드는 리스너를 등록하는데 사용한다.
   2.  그리고 eventEmitter.emit() 메소드를 통해 등록한 이벤트를 호출할 수 있다.

# event_emitter2.js
    const EventEmitter = require('events');
    const util = require('util');

    function MyEmitter() {
      EventEmitter.call(this);
    }
    util.inherits(MyEmitter, EventEmitter);

    const myEmitter = new MyEmitter();
    myEmitter.on('event', () => {
      console.log('an event occurred!');
    });
    myEmitter.emit('event');
&
    const EventEmitter = require('events');

    class MyEmitter extends EventEmitter {}

    const myEmitter = new MyEmitter();
    myEmitter.on('event', () => {
      console.log('an event occurred!');
    });
    myEmitter.emit('event');

# 인자와 this를 리스너에 전달하기
    eventEmitter.emit() 메소드는 인자로 받은 값을 리스너 함수로 전달한다.
    이 과정에서 기억해야 할 부분이 있는데
    일반적으로 EventEmitter를 통해 호출되는 리스너 함수 내에서는
    this가 이 리스너 함수를 부착한 EventEmitter를 참조하도록 의도적으로 구현되어 있다.

    const myEmitter = new MyEmitter();
    myEmitter.on('event', function(a, b) {
      console.log(a, b, this);
        // Prints:
        //   a b MyEmitter {
        //     domain: null,
        //     _events: { event: [Function] },
        //     _eventsCount: 1,
        //     _maxListeners: undefined }
    });
   ...