A poderosa arquitetura orientada a eventos do Node é uma de suas vantagens mais fortes.

Principais conclusões

  • A programação orientada a eventos é uma boa escolha para aplicativos interativos, especialmente aplicativos GUI, pois permite que o código responda às ações do usuário em qualquer ordem.
  • A programação orientada a eventos é comumente usada em aplicativos da web, onde os ouvintes de eventos são acionados quando os usuários interagem com o DOM.
  • Implementar programação orientada a eventos em Node.js é fácil com a classe EventEmitter, que permite criar eventos personalizados e anexar ouvintes de eventos para lidar com eles.

Ao construir qualquer aplicativo de software, uma decisão crucial envolve a seleção do paradigma apropriado para o seu código.

A programação orientada a eventos é uma boa escolha para aplicativos interativos que respondem às ações do usuário que podem ocorrer em qualquer ordem. É um paradigma mais popular com aplicativos GUI do que com programas de linha de comando ou código de sistemas embarcados.

O que são eventos?

Você pode pensar em um evento como uma ação ou ocorrência que seu código pode reconhecer e responder. O sistema ou um usuário pode acionar um evento e seu código geralmente registrará uma função para lidar com isso.

Um exemplo de evento básico é clicar em um botão para executar uma ação específica. O ato de clicar no botão dispara um evento, e a função executada quando ocorre o clique é chamada de ouvinte de eventos (ou manipulador).

O que é programação orientada a eventos?

A programação orientada a eventos é uma paradigma de programação em que o fluxo de execução de uma aplicação depende de eventos que ocorrem, em vez de ser estritamente sequencial.

Este paradigma é usado principalmente na construção de interfaces de usuário e aplicações em tempo real, onde um evento como a ação de um usuário deve desencadear uma ação no sistema.

O paradigma é muito popular na construção de aplicativos da web, onde os ouvintes de eventos são acionados quando os usuários interagem com eles. o Modelo de Objeto de Documento (DOM).

A imagem a seguir visualiza como o fluxo funciona na programação orientada a eventos. Quando ocorre um evento, o canal de eventos o recebe e o repassa ao ouvinte apropriado para tratar:

Programação orientada a eventos em Node.js

O Ciclo de eventos JavaScript é um dos conceitos fundamentais por trás da natureza assíncrona do tempo de execução do Node.js. Uma arquitetura orientada a eventos usa seus recursos integrados Emissor de Evento módulo para facilitar o fluxo de execução contínuo.

Com a programação orientada a eventos, o Node.js permite criar aplicativos do lado do servidor que podem lidar com a interação do usuário, operações de E/S e processamento de dados em tempo real. Isso ocorre de maneira sem bloqueio, resultando em desempenho aprimorado e uma experiência mais tranquila para o usuário.

Implementar programação orientada a eventos em Node.js é fácil quando você entende os conceitos básicos de definição, acionamento e manipulação de eventos.

A classe EventEmitter

Com o Emissor de Evento class em Node.js, você pode criar eventos personalizados e anexar ouvintes de eventos para lidar com eles. Para usar a classe em seu código, importe-a do eventos módulo assim:

// CommonJS
const { EventEmitter } = require("events")

// ES6
import { EventEmitter } from"events"

A classe e suas funções-membro ficam então disponíveis para uso em seu aplicativo. Para começar a emitir e manipular eventos, inicialize uma nova instância do Emissor de Evento aula.

Por exemplo:

const FoodEvents = new EventEmitter()

Isso cria um novo objeto emissor chamado Eventos Alimentares que pode emitir eventos e registrar ouvintes. A classe EventEmmitter fornece três métodos para ouvir um evento: sobre, adicionarListener, e uma vez.

O sobre método é a função mais básica para adicionar ouvintes de eventos, e adicionarListener funciona exatamente da mesma maneira. Ambos aceitam o nome do evento e uma função de retorno de chamada como argumentos. O retorno de chamada é a função do manipulador real. Você pode usar sobre e adicionarListener intercambiavelmente.

Veja como você lida com um evento usando o sobre método:

FoodEvents.on("cookie_ready", (data) => {
console.log("Cookie ready for packaging, data received: ", data);
})

Usando adicionarListener como uma alternativa direta para sobre:

FoodEvents.addListener("cookie_ready", (data) => {
console.log(
"Cookie will now be packaged and sent out, data received: ",
data
);
})

Ambos os exemplos adicionarão o retorno de chamada à matriz de ouvintes de eventos para o cookie_ready evento. Se você usar ambos, seus retornos de chamada serão acionados em ordem.

O uma vez O método registra um ouvinte de evento único que será executado na próxima vez que o evento for acionado. Depois disso, o sistema irá removê-lo do array de ouvintes.

Veja como usar uma vez para lidar com um evento único:

FoodEvents.once("cookie_sent", (data) => {
console.log("Cookie is sent out, data received: ", data);
})

Neste caso, o emissor ouvirá apenas o cookie_enviado evento uma vez e remova o manipulador após sua execução.

Todos os três métodos retornam o emissor, para que você possa encadear chamadas para qualquer um deles.

Não esqueça que, para um ouvinte manipular um evento, a aplicação deve emitir esse evento em algum momento. Aqui está um exemplo de código para emitir o cookie_ready evento usando o emitir método:

functionbakeCookie() {
console.log("Cookie is baking, almost ready...")

setTimeout(() => {
FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
}, 3000)
}

bakeCookie()

Quando você executa este código que imprime um aviso no console de que o cookie está assando, espera 3 segundos e emite o cookie_ready evento, você obterá uma saída como a imagem abaixo:

Isso demonstra como os ouvintes de eventos são executados na ordem em que você os registra.

O Emissor de Evento classe fornece mais métodos, incluindo:

  • removerListener: remove uma instância de um ouvinte da matriz de ouvintes de eventos. O desligado método também está disponível para esse fim.
  • prependListener: Este método também registra um ouvinte, mas, em vez de adicioná-lo ao final do array de ouvintes, ele o adiciona ao início. Ele será executado antes de qualquer outro ouvinte que você já tenha registrado.
  • prependOnceListener: funciona exatamente como prependListener, mas o ouvinte só é executado uma vez, como no caso de uma vez.
  • removerAllListeners: esta função remove todos os ouvintes registrados para um evento nomeado específico, ou todos os ouvintes se você não passar nenhum argumento para ele.
  • ouvintes: Retorna uma matriz de ouvintes do nome do evento que você passa como argumento.
  • nomes de eventos: você pode usar esta função para obter todos os nomes de eventos para os quais você já registrou um ouvinte.
  • setMaxListeners: o Node.js emite um aviso por padrão quando você registra mais de 10 ouvintes para um evento, para evitar vazamentos de memória. Você pode ajustar esse valor padrão usando setMaxListeners. Você também pode verificar esse valor usando getMaxListeners.

O eventos O pacote fornece funcionalidade abrangente para programação orientada a eventos em Node.js.

Quais são algumas práticas recomendadas de programação orientada a eventos?

Cada abordagem de programação tem suas vantagens e desvantagens, e ignorar as práticas recomendadas pode ter efeitos adversos em seu aplicativo. A seguir estão algumas práticas recomendadas a serem consideradas ao criar aplicativos orientados a eventos:

  • Use nomes concisos e descritivos para eventos para permitir uma base de código limpa e de fácil manutenção.
  • Adote boas práticas de tratamento e registro de erros, para permitir fácil depuração de erros.
  • Evite o inferno de retorno de chamada (aninhamento de vários retornos de chamada) ao escrever ouvintes de eventos. Em vez disso, use promessas JavaScript.
  • Não crie muitos ouvintes para um evento. Considere dividir os eventos e encadeá-los.

Crie aplicativos com a arquitetura certa

Uma regra geral que se aplica à construção de software é tomar decisões apropriadas de arquitetura e design. Ao seguir a abordagem errada para construir um aplicativo, você acabará enfrentando as consequências.

A programação orientada a eventos é um paradigma que pode ter um impacto significativo na arquitetura e no desempenho de uma aplicação. Sempre que seu aplicativo, ou parte dele, depender de eventos para funcionar, você deverá considerar a programação orientada a eventos.