É um padrão muito utilizado no Node.js que nos permite emitir eventos para múltiplos listeners. Pode ser utilizado em momento em que apenas um callback de um evento assíncrono não é suficiente.

Exemplo de implementação de um EventEmitter:

'use strict'
const EventEmitter = require('events');

class MyEmitter extends EventEmitter
const myEmitter = new MyEmitter();

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

myEmitter.on('event', () => {
  console.log('same event occurred in another place!');;
});

myEmitter.emit('event');

Um exemplo de utilização de EventEmitter é o Socke.IO:

var fs = require('fs');
var io = require('socket.io')(3000);
require('socket.io-stream')(io);

io.on('connection', function(socket){
  io.emit(fs.createReadStream('file.jpg'));
});

O EventListener chama os listeners conforme a ordem que eles se registraram.

Uma variação comportamental do EventEmitter é once() que acontece apenas uma vez e qualquer chamada pra que ele aconteça é ignorada.

const myEmitter = new MyEmitter();
var m = 0;
myEmitter.once('event', () => {
  console.log(++m);
});
myEmitter.emit('event');
// Prints: 1
myEmitter.emit('event');
// Ignored

Tratamento de exceções

Por padrão o event emitter não tem um evento ‘error’ e quando um evento deste tipo é emitido o node apenas lança uma exceção com throw.

const myEmitter = new MyEmitter();

process.on('uncaughtException', (err) => {
  console.log('whoops! there was an error');
});

myEmitter.emit('error', new Error('whoops!'));
// Prints: whoops! there was an error

O código acima resolve o problema do erro mas como uma boa prática o Node.js recomenda que sempre se crie um evento de erro

const myEmitter = new MyEmitter();
myEmitter.on('error', (err) => {
  console.log('whoops! there was an error');
});
myEmitter.emit('error', new Error('whoops!'));
// Prints: whoops! there was an error

Referência