Search code examples
javascriptnode.jseventsecmascript-6eventemitter

How to create a new EventEmitter and register "open" and "close" event listeners?


The createEmitter function should create a new EventEmitter and register "open" and "close" event listeners. The callbacks for those events should be onOpen and onClose arguments, respectively. The opened and closed methods should raise the "open" and "close" events on the EventEmitter they will receive as emitter arguments. The callbacks should only be invoked once per emitter.

For example, after executing the following code, it should print "Opened!" and then "Closed!":

let emitter = createEmitter(
  () => console.log("Opened!"), () => console.log("Closed!")
);
opened(emitter);
closed(emitter);

My Code:

const events = require("events");
const myEmitter = new events.EventEmitter();

function createEmitter(onOpen, onClose) {    
myEmitter.on('open', onOpen); 
myEmitter.on('close', onClose);
}

function opened(emitter) {
myEmitter.emit('open', emitter); 

}
function closed(emitter) {
myEmitter.emit('close', emitter);
}

let emitter = createEmitter(
  () => console.log("Opened!"), () => console.log("Closed!")
);
opened(emitter);
closed(emitter);

module.exports.createEmitter = createEmitter;
module.exports.opened = opened;
module.exports.closed = closed;

Output:

Opened!
Closed!

Test Cases:

  OK: Example case: Correct answer 
  WRONG: createEmitter registers the correct events: Exception 
  OK: open and close functions raise the correct events: Correct answer 
  WRONG: Callbacks are only invoked once: Wrong answer

Could Anyone explain why the Wrong Answer and the Exception?


Solution

  • I assume that the problem is that your createEmitter function doesn't create an emitter, but adds events to a pre-created one. Try it like this:

    const EventEmitter = require("events"); //events.EventEmitter is just a self reference
    
    function createEmitter(onOpen, onClose) {    
      const myEmitter = new EventEmitter()
      myEmitter.on('open', onOpen); 
      myEmitter.on('close', onClose);
      return myEmitter; //This is important
    }
    
    function opened(emitter) {
      emitter.emit('open'); 
    }
    function closed(emitter) {
      emitter.emit('close');
    }
    
    let emitter = createEmitter(
      () => console.log("Opened!"), () => console.log("Closed!")
    );
    opened(emitter);
    closed(emitter);
    
    module.exports.createEmitter = createEmitter;
    module.exports.opened = opened;
    module.exports.closed = closed;