No node com o módulo de eventos você pode disparar eventos, também chamando de ‘emissor de evento’, até mesmo o node usa em todas as suas APIs para emitir coisas.

Eventos são padrões comuns de programação, para conhecer melhor procure por ‘observer pattern’ ou ‘pub/sub’ (publicar/assinar). Ao passo que callbacks são uma relação um-para-um entre algo que espera pelo callback e outra parte que chama o callback, eventos seguem o mesmo padrão com exceção de que eles são uma API de muitos-para-muitos.

Aqui temos casos comuns de uso dos eventos ao invés de simples callbacks:

  • Uma sala de chat onde você tem um canal de mensagens com muitos ouvintes.
  • Servidor de um jogo que necessita saber quando os players se ligam, desligam, movem-se, atiram ou pulam
  • Conectores de bancos de dados podem precisar saber onde suas conexões estão abertar, fechadas ou enviando um erro

Se você tentar escrever um servidor de chat que se conecte usando apenas callbacks ele irá parecer com isso:

var chatClient = require('my-chat-client')

function onConnect() {
  // exibe a UI quando conectar-se
}

function onConnectionError(error) {
  // exibe erros para o usuario
}

function onDisconnect() {
 // avisa ao usuario que ele foi desconectado
}

function onMessage(message) {
 // exibe a mensagem na UI da sala
}

chatClient.connect(
  'http://mychatserver.com',
  onConnect,
  onConnectionError,
  onDisconnect,
  onMessage
)

Como você pode ver é realmente pesado escrever porque você tem que passar todas as funções em uma ordem especifica para a função .connect. Escrevendo isso com eventos irá se parecer com isso:

var chatClient = require('my-chat-client').connect()

chatClient.on('connect', function() {
  // exibe a UI quando conectar-se
}) 

chatClient.on('connectionError', function() {
  // exibe erros para o usuario
})

chatClient.on('disconnect', function() {
  // avisa ao usuario que ele foi desconectado
})

chatClient.on('message', function() {
  // exibe a mensagem na UI da sala
})

Esta abordagem é bastante similar a utilização com callbacks-puros mas essa abordagem introduz o método .on, onde é atrelado um callback ao evento. Isso significa que você escolhe o que tem que estar assinado para chatClient. Você é capaz de assinar o mesmo evento várias vezes com diferentes callbacks:

var chatClient = require('my-chat-client').connect()
chatClient.on('message', logMessage)
chatClient.on('message', storeMessage)

function logMessage(message) {
  console.log(message)
}

function storeMessage(message) {
  myDatabase.save(message)
}

Mais conteúdo sobre eventos em Node está por ser escrito ainda no livro…