‫Jonas: Como prometido,
‫agora usaremos emissores e ouvintes de eventos na prática
‫e começaremos criando um novo arquivo aqui.
‫Então, eventos. js e feche este aqui.
‫Portanto, para usar os eventos de nó
‫integrados, precisamos exigir o módulo de
‫eventos
‫e, a partir disso, uma classe EventEmitter.
‫Portanto, EventEmitter, esse é o nome
‫padrão para o resultado da solicitação deste módulo de eventos.
‫Então, novamente, este é um módulo de nó embutido, ok?
‫E agora, para criar
‫um novo emissor, simplesmente criamos uma
‫instância basicamente da classe que acabamos de importar.
‫Muito simples, o
‫myEmitter é um novo EventEmitter.
‫Então EventEmitter assim.
‫Então, lembre-se do último vídeo
‫que EventEmitters pode emitir eventos nomeados, e
‫então podemos nos inscrever nesses
‫eventos, então basicamente
‫ouça-os e reaja de acordo, ok?
‫Portanto, é um pouco como configurar um
‫EventListener em um elemento burro, por exemplo, para clicar
‫em um botão, e tenho certeza de
‫que você já fez
‫isso antes, ao trabalhar com JavaScript no lado do cliente, certo?
‫Portanto, nosso emissor
‫emitirá eventualmente um evento nomeado, certo?
‫Então, vamos
‫configurar isso e vamos simplesmente
‫fingir que estamos construindo uma loja online ou algo assim, certo?
‫Portanto, podemos dizer myEmitter. emit (),
‫e então podemos criar qualquer nome de evento que quisermos, ok?
‫Então, queremos emitir um evento chamado newSale, ok?
‫E usando o exemplo de
‫clicar em um botão
‫que eu usei antes, essa emissão aqui é como se estivéssemos
‫clicando no botão, então agora temos que configurar esses ouvintes, ok?
‫E deixe-me fazer isso
‫antes aqui, e então novamente usamos nosso objeto myEmitter.
‫Insira que usamos o método on, certo?
‫Então, em newSale e depois na função de callback, que
‫será executada assim que o evento for emitido.
‫Então, como de costume, vamos simplesmente para o console.
‫"Houve uma nova venda! "Ok,
‫vamos adicionar outro.
‫Portanto, lembre-se de que eu
‫disse anteriormente que uma das coisas boas sobre esses emissores de evento
‫é que podemos
‫configurar vários ouvintes para o mesmo evento.
‫Então, vamos
‫fazer isso aqui e, novamente,
‫é claro, estamos ouvindo o evento
‫newSale (digitando) e, em seguida,
‫registramos apenas outra coisa.
‫Realmente não importa aqui.
‫Portanto, '"Nome do cliente:', por exemplo 'Jonas"'.
‫Então, vamos testar isso, limpar
‫o anterior e usaremos o
‫nó e
‫depois os eventos. js.
‫Então, houve uma venda e o nome do cliente: Jonas,
‫e você já viu que está funcionando.
‫Então, ótimo, esse é o padrão do observador, lembra?
‫Onde este aqui é o objeto que emite os eventos, e então
‫estes dois
‫aqui, então este e este aqui,
‫estes são os observadores.
‫Eles observam o emissor
‫e esperam até que ele emita o novo evento Venda.
‫E, claro, nosso emissor também pode emitir outros eventos.
‫Como um novo cliente ou novo pedido ou
‫algo parecido, e poderíamos adicionar ouvintes para aquele também, certo?
‫Agora, outra coisa que eu
‫queria mostrar a você é que podemos até mesmo
‫passar argumentos para o
‫EventListener, passando-os como um argumento adicional no emissor, aqui.
‫Digamos que passe nove, neste caso apenas
‫um número, e
‫então temos um ouvinte que deseja usar isso.
‫(digitando) Portanto, myEmitter,
‫(digitando) newSale e agora
‫esta função de retorno
‫de chamada
‫pode receber um argumento e, portanto, vamos
‫chamá-la de estoque.
‫Então, basicamente, a quantidade de itens
‫que sobraram do produto que estamos vendendo aqui.
‫Vamos usar uma string de modelo.
‫Agora existem itens
‫em estoque restantes em
‫estoque.
‫Portanto, se executarmos isso agora, veremos Existem
‫agora nove itens restantes em estoque porque emitimos
‫esse evento basicamente com um nove, e
‫o ouvinte pode então
‫pegar esse valor aqui como um
‫argumento de suas funções de retorno de chamada.
‫Portanto, esta variável de estoque aqui neste caso.
‫Então, se você executar
‫isso de novo, aqui existem nove itens restantes em estoque.
‫Então, perfeito, e você vê que esses três
‫logs aqui aparecem exatamente na mesma ordem em
‫que são declarados no código, certo?
‫E esse é o comportamento normal.
‫Se tivermos vários ouvintes para o mesmo evento, eles
‫serão executados de forma síncrona.
‫Então, um após o outro na ordem
‫em que estavam no código.
‫Portanto, este pequeno exemplo já funciona
‫perfeitamente, mas se você fosse usar esse padrão
‫na vida real, a melhor prática seria criar
‫uma nova classe que realmente herdaria do nó EventEmitter.
‫Então, algo assim.
‫(digitando) Então, digamos que
‫a classe Sales estende EventEmitter, e essa é
‫a sintaxe ES6 ou ES2015 para herança de classe.
‫E, novamente, espero que você esteja
‫familiarizado com o ES6 no momento em que estiver fazendo este curso, ok?
‫Então, em termos rotineiros, o EventEmitter é uma classe, então
‫aquele que importamos de eventos para
‫nossa classe
‫de vendas é a nova
‫classe que estamos criando
‫e que herda tudo da classe EventEmitter, certo?
‫Então, no ES6, cada classe obtém um construtor que
‫é uma função
‫que é executada assim que criamos um novo objeto de uma classe, ok?
‫E o que precisamos fazer aqui é
‫chamar super, e isso é
‫algo que sempre temos que fazer quando estendemos outra superclasse, ok?
‫Portanto, esta
‫é a classe pai e esta
‫é a superclasse e,
‫executando super, obtemos acesso a todos os métodos da classe pai.
‫Então, novamente, EventEmitter neste caso, ok?
‫E agora o que temos que
‫fazer é mover este aqui
‫para baixo, (clicando)
‫e agora meu emissor é um novo Sales, ok?
‫E agora vai funcionar exatamente da mesma forma
‫e, de fato, vamos lá, e
‫na verdade esse mecanismo que acabei de mostrar aqui.
‫Portanto, basicamente estender a classe EventEmitter é exatamente como
‫os diferentes módulos de
‫nó, como HTTP, sistema de arquivos e muitos outros módulos de
‫núcleo de nó implementam eventos internamente, certo?
‫Portanto, todos eles
‫realmente herdam da classe EventEmitter.
‫Ok, e com este pequeno
‫exemplo funcionando, vamos tentar outra coisa.
‫Então, como eu estava falando agora sobre o
‫módulo HTTP, deixe-me demonstrar a vocês
‫que ele é totalmente baseado em eventos, certo?
‫Portanto, temos essa parte funcionando.
‫Vamos criar alguns comentários aqui, algo,
‫e depois criar outro exemplo aqui embaixo, certo?
‫E o que vamos
‫fazer é basicamente criar um pequeno
‫servidor web e, em seguida, ouvir o evento que ele emite, certo?
‫Então, aqui em cima precisamos importar o
‫módulo HTTP, (digitando)
‫E aqui embaixo podemos usá-lo.
‫Estamos criando um
‫servidor e agora vou fazer
‫um pouco diferente do que fizemos na primeira interseção, certo?
‫Mas na verdade funciona exatamente da mesma maneira.
‫Portanto, tudo o que farei aqui agora é http. createerver e assim, e
‫agora o
‫que vou fazer é
‫basicamente ouvir os diferentes eventos que
‫o servidor irá emitir.
‫Então, para isso, novamente, estou usando on,
‫e se você ver. em qualquer lugar em
‫um projeto de nó, bem, então você já
‫sabe que está ouvindo, ou que o código está ouvindo por um evento, certo?
‫E então o que
‫estamos ouvindo aqui é o evento de solicitação, ok?
‫E agora funciona da mesma forma que antes,
‫temos uma função
‫de retorno de chamada que obtém acesso à solicitação e à resposta.
‫Então nada, neste ponto, fizemos
‫exatamente isso no projeto de farm de nós, certo?
‫Então, console. log
‫(digitando) "solicitação recebida" e
‫depois também vamos enviar algo de volta.
‫(digitando) Apenas
‫o mesmo texto, certo?
‫E, claro, podemos ouvir várias
‫vezes o mesmo evento.
‫(clicando) Então, vamos apenas dizer
‫aqui "Outro pedido" usando algum emoji
‫aqui apenas para fazê-lo aparecer um pouco mais, e ele não
‫está aparecendo.
‫O que está acontecendo aqui?
‫Ah, aqui vamos nós.
‫Então, ouvindo um pedido,
‫e também podemos ouvir o evento de fechamento.
‫Então, server on close, e esse é o
‫evento que
‫é disparado quando o servidor, como você pode imaginar, fecha.
‫(digitando) Ok, isso
‫é ouvir os eventos e agora,
‫lembre-se, também
‫temos que iniciar o servidor.
‫Então, iniciamos o servidor usando
‫o servidor. escute, passe
‫na porta, o endereço que é localhost novamente
‫para nós neste caso,
‫aponte um, e então, nossa função de callback que é
‫opcional, mas vamos incluí-la aqui novamente.
‫(digitando) "Aguardando solicitações
‫... "Então,
‫vamos começar isso
‫e veremos Aguardando solicitação ... e o aplicativo não fecha, e agora você
‫sabe por que ele não fecha, certo?
‫É assim porque o loop de evento ainda está esperando por
‫E / S de entrada, certo?
‫Então foi isso que aprendemos nas palestras de loop de eventos, certo?
‫Agora, vamos realmente fazer uma solicitação na porta 8.000 neste URL.
‫(clicando) (digitando) E aqui
‫vamos nós.
‫Então, vemos Solicitação recebida.
‫Então funciona porque assim que houver uma nova
‫requisição, o servidor emite automaticamente o objeto da requisição, ok?
‫E podemos ver que aqui, é claro, e aqui no
‫console, vemos nossa string de
‫solicitação recebida.
‫Na verdade, eu queria pegar outro aqui.
‫Portanto, podemos, é claro, enviar apenas uma resposta.
‫Portanto, aqui devo ter outro console. log em vez disso.
‫Então, vamos sair disso, inicie-o
‫novamente, recarregue e, sim, agora temos Solicitação recebida,
‫que
‫é deste primeiro EventListener, e
‫outra solicitação deste segundo EventListener.
‫Uma coisa que você provavelmente está percebendo é que cada um deles aqui,
‫na verdade, é registrado duas vezes.
‫Isso significa que o servidor está, na verdade, emitindo o
‫evento de solicitação duas vezes também.
‫Então, vamos ver por que isso acontece.
‫(digitando)
‫Então console. log, solicitação. url.
‫Com isso, agora podemos
‫obter acesso à URL da solicitação.
‫(clicando) Vamos encerrar
‫aqui.
‫Execute-o novamente, recarregue,
‫e assim temos
‫um
‫para o URL raiz e outro para o favicon. ico Então os navegadores tentam automaticamente
‫solicitar um
‫favicon para cada site, ok?
‫Então é por isso que cada um deles apareceu duas vezes, certo?
‫Então, você vê que nem sempre temos que
‫emitir eventos.
‫Isso é mais quando tentamos usar o EventEmitter por conta própria.
‫Então, basicamente, quando tentamos usar nossos eventos personalizados
‫em nossos aplicativos.
‫Neste caso, é claro, temos que emitir
‫os próprios
‫eventos, mas se estivermos usando um módulo de nó
‫embutido, então essas funções lá irão muitas vezes emitir
‫seus próprios eventos, e tudo o que temos
‫que fazer é ouvir eles.
‫Então foi exatamente isso que fizemos aqui, e
‫com isso, eu acho, você agora sabe tudo o que
‫precisa saber sobre
‫eventos e está pronto para vir comigo para o próximo vídeo.