<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Edward Teixeira Dias Junior</title>
    <description>The latest articles on DEV Community by Edward Teixeira Dias Junior (@edwardteixeira).</description>
    <link>https://dev.to/edwardteixeira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F358564%2Feb928045-0052-44d1-a0e2-4a39b1526d2f.jpeg</url>
      <title>DEV Community: Edward Teixeira Dias Junior</title>
      <link>https://dev.to/edwardteixeira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edwardteixeira"/>
    <language>en</language>
    <item>
      <title>RXJS parte 1 - Observables</title>
      <dc:creator>Edward Teixeira Dias Junior</dc:creator>
      <pubDate>Sun, 31 Jan 2021 22:26:44 +0000</pubDate>
      <link>https://dev.to/edwardteixeira/rxjs-parte-1-observables-50cp</link>
      <guid>https://dev.to/edwardteixeira/rxjs-parte-1-observables-50cp</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Esse é o primeiro de uma série de artigos sobre RXJS, onde aprenderemos os mais diversos operadores e suas aplicabilidades através de pequenos projetos que usaremos como exemplos.&lt;/p&gt;

&lt;p&gt;Nesse primeiro post, vamos introduzir o conceito de &lt;strong&gt;observables&lt;/strong&gt;, conhecimento indispensável para dominar tudo que a &lt;strong&gt;programação reativa&lt;/strong&gt; nos tem a nos oferecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto
&lt;/h2&gt;

&lt;p&gt;Antes de partimos para as definições em sí, vamos contextualizar os motivos de se usar &lt;strong&gt;observables&lt;/strong&gt;. Considere o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Aqui, declaramos uma variável e atribuímos o valor de 10, portanto x = 10.&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A mesma coisa com arrays&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de declaradas, variáveis podem ser usadas durante todo o programa, para os mais diversos casos de uso. Contudo, a vida seria muito simples se todas as aplicações ou programas se comportassem dessa forma. Nem sempre temos todos os dados de que precisamos de forma instantânea quando o nosso programa ou aplicação forem inicializados.Ás vezes precisamos fazer requisições AJAX que trarão (ou não, caso ocorra algum erro) esses dados de que precisamos em algum momento, que não sabemos de antemão.&lt;/p&gt;

&lt;p&gt;Por exemplo, digamos que queremos informações de algum usuário para executar alguma funcionalidade no nosso sistema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Variável que espera o retorno de uma requisição AJAX&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pegarDadosDoUsuário&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="c1"&gt;// Função para fazer algum processamento com os dados recebidos&lt;/span&gt;
&lt;span class="nx"&gt;facaAlgumaCoisa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userRequest&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse exemplo, duas coisas podem acontecer: um enxurrada de erros no nosso sistema e/ou um print hemorrágico da stackTrace. Ora, estamos declarando uma variável, atribuindo um valor de um retorno de uma função que nem sabemos &lt;strong&gt;quando&lt;/strong&gt; vamos ter acesso e passando essa variável para uma outra função que irá fazer algum processamento com base nesse dado que pode nem estar disponível. Dá pra imaginar? Bom, podemos consertar o nosso programa fazendo com que a nossa função facaAlgumaCoisa() só seja invocada quando tivermos algum dado na nossa variável user. Parece bom, certo?&lt;/p&gt;

&lt;h2&gt;
  
  
  Promises
&lt;/h2&gt;

&lt;p&gt;Uma &lt;strong&gt;promise&lt;/strong&gt; representa uma &lt;strong&gt;promessa&lt;/strong&gt; de que os dados solicitados vão estar disponíveis em algum momento no futuro. Quando esses dados chegarem, devemos acessá-los usando um método chamado .then( ), assim podemos ter de fato acessar os nossos dados de que tanto precisamos e continuar o fluxo normal do nosso sistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Variável que espera o retorno de uma requisição AJAX que retorna uma promise&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pegarDadosDoUsuário&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Chamada do método then para termos acesso aos dados de user&lt;/span&gt;
&lt;span class="nx"&gt;userRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;dadosDoUsuarioVindosDoServidor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Função para fazer algum processamento com os dados de user&lt;/span&gt;
  &lt;span class="nx"&gt;facaAlgumaCoisa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dadosDoUsuarioVindosDoServidor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comportamente de uma &lt;strong&gt;promise&lt;/strong&gt; faz jus ao nome, ou seja, é realmente uma promessa de que dados irão retornar de uma requisição e enquanto esses dados não voltam, processos são liberados para fazer outras coisas até o nosso servidor percorrer os vários índices do nosso banco de dados e finalmente mandar a nossa resposta. Uma vez que a reposta finalmente chega do nosso servidor, a &lt;strong&gt;promise&lt;/strong&gt; é realizada com sucesso e acessamos o método then( ) para recebermos o nossos tão aguardados dados - e daí em diante finalmente podemos seguir em paz com o nosso programa fazendo uso dessa variável.&lt;/p&gt;

&lt;p&gt;Lembrando que caso essa função retorne algum erro, podemos tratar com um outro método chamado catch( ), tendo assim acesso ao o que aconteceu com a nossa requisição através da variável &lt;strong&gt;error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É com esse problema de natureza assíncrona que observables se tornam uma boa ferramenta para serem utilizadas em nossas aplicações.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observables
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Observables&lt;/strong&gt; são como arrays, e representam uma coleção de eventos, e também são como promises porque também são assíncronos: cada evento é disparado em algum momento no futuro. Porém apesar da semelhança com uma coleção de &lt;strong&gt;promises&lt;/strong&gt; ( como Promise.all( ) ) é importante notar que promises emitem apenas um evento/valor, enquanto que &lt;strong&gt;Observables&lt;/strong&gt; emitem um número arbitrário de eventos ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Observables podem ser usados para modelar clicks de botões, onde podem representar todos os clicks que irão ocorrer em todo o ciclo de vida da nossa aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Por convenção, o $ (dollar sign) é utilizado no final do nome da variável quando esta é um observable.&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;observable$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cliqueNoBotao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagine que esse observable irá representar todos os clicks de botões da nossa aplicação. Para podermos acessar os eventos emitidos desses clicks devemos, da mesma forma como .then( ) em promises, utilizar um método chamado &lt;strong&gt;subscribe()&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O método subscribe() espera receber como argumento uma função que é chamada cada vez que o observable emite um evento. Por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;observable$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cliqueNoBotao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Método subscribe para podermos acessar os eventos de click&lt;/span&gt;
&lt;span class="c1"&gt;// Para cada click, será printada a mensagem abaixo&lt;/span&gt;
&lt;span class="nx"&gt;observable$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;clickEvent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;O botão foi clicado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Se quisermos acessar as propriedades dos evento de click, basta utilizarmos o parametro dessa função - nesse caso, clickEvent.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com o código acima criamos o nosso primeiro observable e acessamos os valores emitidos por ele.&lt;/p&gt;

&lt;p&gt;Vale a pena notar, contudo, que observables são preguiçosos - ou &lt;strong&gt;lazy&lt;/strong&gt;. O que isso significa? Se por acaso um observable não tiver nenhum subscriber, nenhum valor será emitido. Ou seja, um observable não curte muito conversar sozinho - se não tiver ninguém ouvindo, ele simplesmente não fala nada!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;observable$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;cliqueNoBotao&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myButton&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Botão foi clicado mas nada é emitido, porque não tem um nenhum subcriber( )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Obs: quando nos referirmos a um subscriber, queremos dizer que nenhum método subscribe( ) foi chamado em um observable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vamos colocar em prática esse conhecimento criando um pequeno crônometro, mas antes vamos aprender um pouco sobre diagramas de marble.&lt;/p&gt;

&lt;h2&gt;
  
  
  Facilitando o entedimento com diagramas de marble
&lt;/h2&gt;

&lt;p&gt;Tratar de observables é tratar de data streams, ou emissão de dados ao longo do tempo - o conceito de streams aqui pode ser resumido em: eventos/dados em andamento ordenados no tempo. Pode ser um conceito inicialmente nebuloso, que é necessário um certo grau de abstração para podermos ter uma visão clara sobre o fluxo de dados que um observable emite. Para facilitar as coisas, vamos aprender um pouco sobre diagramas de marble e podemos tirar proveito deles para criar um modelo mental sobre o fluxo de um observable.&lt;/p&gt;

&lt;p&gt;Primeiro temos a &lt;strong&gt;timeline&lt;/strong&gt; (ou linha do tempo), ilustrando a passagem do tempo da emissão dos eventos pelo observables. É representado por uma flecha:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--c8X_MwC0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/633/1%2AbrbCs4smjZfqitE0kHSHTQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c8X_MwC0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/633/1%2AbrbCs4smjZfqitE0kHSHTQ.png" alt='"a timeline de um diagram de marble"'&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;a timeline de um diagram de marble&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O segundo elemento são os valores que percorrem a timeline - ou, um fluxo que completou. O | no final da timeline, demonstra que ele terminou:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6ZiYd4gE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/636/1%2Ab-7_jU--CKfTkZ3hL66U6Q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6ZiYd4gE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/636/1%2Ab-7_jU--CKfTkZ3hL66U6Q.png" alt='"a timeline de um diagram de marble"'&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;valores sendo emitidos na timeline&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Como podemos ver, a leitura é simples: um circulo foi emitido em determinado momento por um observable. Como normalmente trabalhamos com dados complexos, você pode substituir as formas geometricas pela abstração que quiser - no momento o importante é visualizar esses dados sendo emitidos ao longo do tempo.&lt;/p&gt;

&lt;p&gt;Um fluxo que termina com erros - representado pelo X:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k7N7LuVk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/639/1%2ADxXNdInXrcKT0Jg3WdGafQ.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k7N7LuVk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/639/1%2ADxXNdInXrcKT0Jg3WdGafQ.png" alt='"a timeline de um diagram de marble"'&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;um fluxo que terminar com erros&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Um fluxo que nunca terminou:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--igOEqIF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/636/1%2AWrctZLIzj2Ptr5qrfHlW4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--igOEqIF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://miro.medium.com/max/636/1%2AWrctZLIzj2Ptr5qrfHlW4g.png" alt='"a timeline de um diagram de marble"'&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;um fluxo infinito&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pronto, isso é tudo que você precisa saber sobre diagramas de marble por agora. Quando avançarmos, vamos ver os mais diferentes fluxos possíveis.&lt;/p&gt;
&lt;h2&gt;
  
  
  Criando um crônometro
&lt;/h2&gt;

&lt;p&gt;Para fixar os conceitos que aprendemos, iremos construir um pequeno crônometro. O crônomero tem dois botões: Iniciar e Parar. Abaixo desses botões vamos ter a contagem do tempo decorrido, representado segundos e milisegundos. Para todos os projetos que fizermos, vamos utilizar a biblioteca RXJS, a mais mais popular biblioteca do mundo javascript para programação reativa. Usaremos typescript ao invés de vanilla JS nesse artigo e webpack.&lt;/p&gt;

&lt;p&gt;O código do projeto vai estar disponível no final do artigo. O setup do projeto pode ser feito seguindo a leitura desse &lt;a href="https://medium.com/codingthesmartway-com-blog/getting-started-with-rxjs-part-1-setting-up-the-development-environment-creating-observables-db76ce053725"&gt;artigo&lt;/a&gt;. Se você não quer se preocupar em configurar o ambiente, você pode utilizar o &lt;a href="https://rxjs-playground.github.io/#/"&gt;rxjs playground&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vamos começar criando nosso arquivo HTML com o seguinte conteúdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- 

Aqui temos dois botões, um para iniciar o cronometro, outro para parar.

Na tag h2 mostramos o tempo do nosso cronometro. --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Cronometro&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"botao-iniciar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Iniciar&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"botao-parar"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Parar&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
          &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"tempo"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;0.0s&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"cronometro.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lógica da nossa aplicação é bem simples: teremos 3 observables, um para monitorar o inicio da contagem representado pelo botao Iniciar, outro para parar a contagem representado pelo botão Parar; o terceiro observable será responsável pela contagem em segundos do tempo decorrido, sendo incrementado a cada 1/10 de segundo e atualizar a página com o tempo decorrido.&lt;/p&gt;

&lt;p&gt;Primeiramente, no nosso cronometro.js, precisamos importar um observable que será responsável por manter no radar o tempo decorrido em 1/10 de segundos para podermos computar isso no HTML. A biblioteca RXJS conta com várias tipos de operadores. Operadores são funções que podemos utilizar para criar e manipular observables. Para começar, vamos importar o nosso primeiro observable, chamado de Interval(). Em seguido vamos fazer o subscribe para ver o que ele emite.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// aqui importamos os operadores da biblioteca&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// atribuimos a variavel o observable interval;&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// imprimios no console a cada 100 milisegundos o tempo decorrido desde a subscription&lt;/span&gt;
&lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ainda não é bem o que queremos, aqui estamos recebendo esses valores de forma ainda bruta, precisamos de uma forma de manipular esses valores para que tenhamos a representação de segundos e milisegundos. Para isso, precisamos de um operador que manipule os dados emitidos pelo nosso observable decimoDeSegundo$. Para fazer isso, vamos precisar de um operador chamado &lt;strong&gt;map&lt;/strong&gt;. O map do rxjs funciona quase da mesma forma que o map do javascript, ele recebe uma função e faz uma manipulação dos dados e devolve os novos dados transformados. A diferença aqui é que o map do javascript manipula arrays, e o map do rxjs manipula observables.&lt;/p&gt;

&lt;p&gt;Além, disso para podermos aplicar a transformação nos dados do observables, precisa utilizar o operador pipe(). Pipes são usados para encadear operações nos observables de maneira síncrona - isto é, apesar dos dados do observable serem emitidos ao longo do tempo, o map aplica essas transformações instântaneamente. Então, o que queremos fazer é pegar os dados emitidos pelo observable e dividir por 10, assim fica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// transformamos cada numero emitido pelo observable e dividimos por 10&lt;/span&gt;
&lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A próxima coisa que devemos fazer, é mapear dois observables para o click dos botões. Para fazermos isso, primeiro vamos pegar o id dos botões:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs/operators&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;botaoIniciar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#botao-iniciar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;botaoParar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#botao-parar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora que são temos a referência dos botões no nosso HTML, devemos criar nossos observables para mapear os eventos emitidos nos botões - para isso, vamos importar um novo operador do RXJS, chamado fromEvent, que transforma os eventos no elemento em observables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromEvent&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs/operators&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;botaoIniciar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#botao-iniciar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;botaoParar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#botao-parar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;//Transformar o "event listener" em um observable.&lt;/span&gt;
&lt;span class="c1"&gt;// fromEvent espera um elemento HTML e um evento a ser disparado&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cliqueIniciar$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;botaoIniciar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cliqueParar$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;botaoParar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;time&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como exercício, faça o subscribe nos cliques, coloque um console log em cada subscribe e veja se está tudo funcionando corretamente. Para cada clique, um log deve ser emitido!&lt;/p&gt;

&lt;h3&gt;
  
  
  Finalizando o nosso cronômetro
&lt;/h3&gt;

&lt;p&gt;Agora, devemos pegar a tag html para mostrar a contagem de tempo do HTML. Vamos utilizar todos os conceitos discutidos até aqui e juntar tudo no código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pipe&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;takeUntil&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rxjs/operators&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;botaoIniciar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#botao-iniciar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;botaoParar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#botao-parar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tempoDisplay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;HTMLElement&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#tempoDisplay&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cliqueIniciar$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;botaoIniciar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cliqueParar$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fromEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;botaoParar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;cliqueIniciar$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;decimoDeSegundo$&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;takeUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cliqueParar$&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;tempoDisplay&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;s&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, algumas coisas estão acontecendo aqui, vamos quebrar o código e explicar por partes. Acontece o seguinte, o que queremos fazer é quand o usuário clicar no botão iniciar, queremos começar a contagem do nosso tempo. Para isso fazemos um subscribe no botão iniciar, e quando o primeiro evento por disparado, a contagem começa.&lt;/p&gt;

&lt;p&gt;Dentro do subscribe do observable cliqueIniciar$, vamos inicializar o outro observable decimoDeSegundo$ que roda o seu construtor, fazer as operações do pipe e atualiza o html com o valor computado. Pode parecer confuso criar um modelo mental sobre quando o pipe efetivamente transforma os dados com as funções map e takeUntil - que vamos explicar logo mais. Então, tenha em mente que as operações do pipe rodam assim que o subscribe acontece, então o que recebemos na nossa variável result já são os valores transformados. Então, você deve estar se perguntando, o que faz takeUntil?&lt;/p&gt;

&lt;p&gt;O operador takeUntil é acoplado no fluxo da nossa stream e recebe como paramêtro um outro observable que quando disparado para o fluxo atual de da cadeia de observables. Esse operador faz o que o nome realmente diz, ele emite os dados da stream até que o evento do observable passado como parâmetro é disparado. Ou seja, quando o evento do click parar for disparado, o nosso fluxo do observable decimoSegundo$ é cessado - takeUntil faz automáticamente o unsubscribe dos observables da stream. Mas você deve estar se perguntando, como sabemos que o botão parar foi acionado se não existe nenhum subscriber no observable cliqueParar$? Bom, adicionalmente, takeUntil faz o subscribe e o unsubscribe do observable passado como parâmetro automáticamente.&lt;/p&gt;

&lt;p&gt;E então finalizamos o nosso cronômetro. Espero que vocês tenham gostado e qualquer crítica construtiva sobre o artigo pode ser deixado nos comentários.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Links adicionais para leitura:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.learnrxjs.io/"&gt;https://www.learnrxjs.io/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rxmarbles.com/"&gt;https://rxmarbles.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/staltz/868e7e9bc2a7b8c1f754"&gt;https://gist.github.com/staltz/868e7e9bc2a7b8c1f754&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Código&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/edward-teixeira/rxjs-cronometro"&gt;https://github.com/edward-teixeira/rxjs-cronometro&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Classe Event Emitter do Nodejs</title>
      <dc:creator>Edward Teixeira Dias Junior</dc:creator>
      <pubDate>Sun, 30 Aug 2020 16:15:20 +0000</pubDate>
      <link>https://dev.to/edwardteixeira/a-classe-event-emitter-do-nodejs-54kp</link>
      <guid>https://dev.to/edwardteixeira/a-classe-event-emitter-do-nodejs-54kp</guid>
      <description>&lt;h1&gt;
  
  
  A Classe Event Emitter do NodeJs
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Event Emitters&lt;/strong&gt; são um dos conceitos mais importantes no Node, pois é com eles que emitimos eventos, que podem ser ouvidos por outros objetos no programa. Através dessa arquitetura é que podemos &lt;strong&gt;conectar&lt;/strong&gt; pedaços de código distantes entre sí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas afinal, o que são Event Emitters?
&lt;/h2&gt;

&lt;p&gt;Um Event Emitter é um objeto que emite notificações, ou eventos, em diferentes partes do seu ciclo de vida. Por exemplo, um servidor emite eventos em cada estágio da sua inicialização até o seu desligamento. Quase todos os core modules do node fazem uso dos event emitters, que também são importantes para a implementação da programação assíncrona, conceito essencial do mundo javascript.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Classe Event Emitter
&lt;/h2&gt;

&lt;p&gt;O objeto event emitter reside no módulo chamado 'events'. Normalmente, não usuaríamos diretamente esse módulo, mas sim de objetos que fazem uso dele.&lt;/p&gt;

&lt;p&gt;Na classe Event Emitter temos vários métodos interessantes para emitir, cadastrar e processar eventos. Alguns dos mais usados são &lt;strong&gt;&lt;em&gt;on( )&lt;/em&gt;&lt;/strong&gt;, onde registramos um event, e &lt;strong&gt;&lt;em&gt;emit( )&lt;/em&gt;&lt;/strong&gt; onde emitimos de fato o evento.&lt;/p&gt;

&lt;p&gt;Para começar, vamos importar o módulo 'events' no nosso arquivo &lt;strong&gt;&lt;em&gt;index.js&lt;/em&gt;&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Depois de importar o módulo, vamos criar uma classe chamada Coração com o seguinte método:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;Coracao&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;bater&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tum-tum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Tum-tum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Acima criamos uma classe que simula um coração e que herda de Event Emitter (assim teremos acesso a todos os seus métodos), nela definimos um método chamado bater( ), que emite um evento com o nome de 'bater' e printa no console.&lt;/p&gt;

&lt;p&gt;Agora, precisamos registrar um listener para sermos notificados desse evento toda vez que ele é emitido.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;coração&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Coracao&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;coração&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;bater&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ouvindo o coração batendo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Acima cadastramos uma função que 'ouve' o evento 'bater' emitido pelo método bater( ) da classe coração.&lt;/p&gt;

&lt;p&gt;Agora precisamos chamar o método para que possamos processar e emitir o evento:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;coração&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bater&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;No console, temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Observando&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;coração&lt;/span&gt; &lt;span class="nx"&gt;batendo&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Observando&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;coração&lt;/span&gt; &lt;span class="nx"&gt;batendo&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Observando&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;coração&lt;/span&gt; &lt;span class="nx"&gt;batendo&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Observando&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;coração&lt;/span&gt; &lt;span class="nx"&gt;batendo&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Observando&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;coração&lt;/span&gt; &lt;span class="nx"&gt;batendo&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;span class="nx"&gt;Tum&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;tum&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Processando dados com Event Emitter
&lt;/h2&gt;

&lt;p&gt;Podemos também processar dados com o Event Emitter, um exemplo simples seria somar os elementos de um array, e retornar para o listener (ou receptor) o resultado da soma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sumEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Acima instanciamos o objeto Event Emitter, que vamos chamar de sumEvent. Depois, vamos registrar um evento que será executado quando emitido. Para isso, vamos definir o nome do evento, os dados que ele irá receber e uma função de callback que será retornada passando o resultado da soma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sumEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Agora vamos emitir o evento passando os nossos parametros:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sumEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sum&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Quando o evento é emitido, temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E é assim que usamos a classe Event Emitter do node.&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
