<?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>Forem: Alan Pereira</title>
    <description>The latest articles on Forem by Alan Pereira (@alanfabricio).</description>
    <link>https://forem.com/alanfabricio</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%2F405671%2Fd8a23c6c-a33b-459f-98ce-e54591676e1b.jpg</url>
      <title>Forem: Alan Pereira</title>
      <link>https://forem.com/alanfabricio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alanfabricio"/>
    <language>en</language>
    <item>
      <title>Iniciante: Abrindo seus projetos com VSCode através do terminal</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Thu, 27 Jul 2023 04:39:15 +0000</pubDate>
      <link>https://forem.com/alanfabricio/iniciante-abrindo-seus-projetos-atraves-do-terminal-17g1</link>
      <guid>https://forem.com/alanfabricio/iniciante-abrindo-seus-projetos-atraves-do-terminal-17g1</guid>
      <description>&lt;p&gt;Muitas pessoas que estão iniciando na programação e utilizam o VSCode ainda abrem os seus projetos da maneira "lenta", indo pelo menu de Arquivo e selecionando uma pasta para abrir.&lt;/p&gt;

&lt;p&gt;No entanto, a medida que vamos tendo mais projetos e trabalhando cada vez mais com programação, essa acaba sendo uma maneira menos prática, e como desenvolvedores nós sempre estamos tentando encontrar uma maneira de fazer as coisas melhores, por mais simples que sejam.&lt;/p&gt;

&lt;p&gt;Por isso, uma das formas mais práticas de se abrir diferentes projetos pelo VSCode é através da linha de comando, e hoje vou te mostrar como.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclaimer: Fiz este tutorial para usuários de Windows, se você usa outro sistema operacional, o método é similar mas provavelmente será diferente em algum ponto.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilizando comando code
&lt;/h3&gt;

&lt;p&gt;O comando &lt;code&gt;code&lt;/code&gt; permite abrir um arquivo ou pasta no terminal, para isso, basta digitar &lt;code&gt;code caminho_do_arquivo_ou_pasta&lt;/code&gt; e o VSCode irá abrir automaticamente no arquivo/pasta selecionado. Neste sentido, o que eu costumo fazer é navegar via Explorer até a pasta que eu quero, e só assim a partir daí abrir um terminal na pasta desejada (usando shift + botão direito e abrindo o Power Shell). A partir daí eu aplico o comando &lt;code&gt;code .&lt;/code&gt;. Veja um exemplo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Fopening_vscode2.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Fopening_vscode2.gif%3Fraw%3Dtrue" alt="opening vscode" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas eu tenho o comando code?
&lt;/h3&gt;

&lt;p&gt;Se você ainda não adicionou o comando do VSCode pelo seu terminal ou não sabe se o adicionou, para verificar é muito simples. Abra uma pasta de um projeto qualquer e tente digitar o comando &lt;code&gt;code .&lt;/code&gt; no terminal. &lt;/p&gt;

&lt;p&gt;Caso você não tenha o comando instalado no seu terminal, uma mensagem de erro deve aparecer. Segue um exemplo usando o Windows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Fusando_comando_code_sem_o_path.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Fusando_comando_code_sem_o_path.gif%3Fraw%3Dtrue" alt="code command error" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Adicionando o comando code
&lt;/h4&gt;

&lt;p&gt;Existem algumas maneiras de instalar esse comando para ser usado direto no seu terminal. A primeira dela é apresentada da forma mais óbvia: no próprio instalador. Quando instalamos o VSCode (pelo menos no Windows, não sei nos outros SO), é só você marcar a opção “Add to path”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Faddtopath.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Faddtopath.png%3Fraw%3Dtrue" alt="add to path option from installer" width="445" height="328"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Desta forma, da próxima vez que você abrir o seu terminal de preferência, o comando code estará pronto para ser usado.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Caso esse comando não apareça:&lt;/strong&gt;&lt;/em&gt;  Fiz alguns testes e pesquisas, e pelo Windows, parece que o VSCode não fornece mais a opção de adicionar esse comando ao path posteriormente. Portanto recomendo salvar todas as suas configurações na nuvem através da sincronização de opções, permitindo que você desinstale o VSCode e reinstale-o sem perder nada e ativando a opção do passo anterior no instalador.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Fsettingsync.jpeg%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2Fadd-code-to-path-windows%2Fassets%2Fsettingsync.jpeg%3Fraw%3Dtrue" alt="setting sync on vscode" width="350" height="132"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Finalmente, desta forma você agora conseguirá abrir os seus arquivos e projetos de forma muito mais rápida e eficiente no VSCode. E aí, sabia dessa? Se foi útil, deixa um ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/o9C3VLpwpkk5VaXMlT/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/o9C3VLpwpkk5VaXMlT/giphy.gif" alt="Bye" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>beginners</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Adicionando o Prettier ao seu projeto JavaScript/TypeScript</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Fri, 20 Jan 2023 00:23:19 +0000</pubDate>
      <link>https://forem.com/alanfabricio/adicionando-o-prettier-ao-seu-projeto-javascripttypescript-226g</link>
      <guid>https://forem.com/alanfabricio/adicionando-o-prettier-ao-seu-projeto-javascripttypescript-226g</guid>
      <description>&lt;p&gt;Uma das maiores dificuldades de quem está iniciando em programação é o uso correto de nomenclaturas, regras de sintaxe e desatenção a detalhes que podem acabar sacrificando o seu tempo de estudo em busca de correções de escrita e erros de digitação.&lt;/p&gt;

&lt;p&gt;Felizmente, existe uma maneira de facilitar a sua vida para que a sua IDE faça essas correções automaticamente, salvando um tempo precioso de digitação. E a ferramenta para isso é o &lt;strong&gt;Prettier&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Através dele, podemos configurar regras específicas de como a sintaxe do seu código deve se comportar, corrigindo automaticamente eventuais erros e criando uma padronização, independente de quem esteja trabalhando no projeto.&lt;/p&gt;

&lt;p&gt;Vejamos um exemplo. Podemos estabelecer as seguintes regras:&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="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;semi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// As declarações devem terminar com semicolon (ponto e vírgula ;)&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;singleQuote&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Strings devam utilizar por padrão aspas simples&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com estas regras, a partir da declaração seguinte, o Prettier poderá fazer a formatação automática do seu 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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variavelAntes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;variável antes do Prettier&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;variavelDepois&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;variável depois do Prettier&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;Podemos utilizar o Prettier com uma certa profundidade, trazendo um leque de regras que irá nos ajudar a deixar nosso código padronizado e, como o próprio nome sugere, mais bonito. Então vamos botar a mão na massa e configurar essa belezinha no nosso projeto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;VSCode: Usaremos as configurações do Prettier no VSCode, então fique esperto para configurar caso você utilize outra IDE&lt;/li&gt;
&lt;li&gt;Um projeto Node com &lt;code&gt;package.json&lt;/code&gt; em Javascript ou Typescript&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm&lt;/code&gt; ou &lt;code&gt;yarn&lt;/code&gt; instalado&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Instalação
&lt;/h2&gt;

&lt;p&gt;Adicionaremos o Prettier como uma dependência de desenvolvimento. Podemos fazer isso utilizando o comando &lt;code&gt;npm&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;npm install -D prettier&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ou &lt;code&gt;yarn&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;yarn add -D prettier&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dica: Para evitar conflito na instalação de pacotes, sempre use somente um dos dois comandos. Evite misturar o &lt;code&gt;yarn&lt;/code&gt; e o &lt;code&gt;npm&lt;/code&gt; no seu projeto pois cada gerenciador de pacotes irá criar o seu próprio arquivo &lt;code&gt;lock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em outras palavras, se escolher o &lt;code&gt;yarn&lt;/code&gt;, evite ter o arquivo &lt;code&gt;package-lock.json&lt;/code&gt; no projeto (pode deletar sem medo). Se escolher o &lt;code&gt;npm&lt;/code&gt;, evite ter o arquivo &lt;code&gt;yarn.lock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Caso o Prettier tenha sido adicionado com sucesso no seu projeto, seu arquivo &lt;code&gt;package.json&lt;/code&gt; deve ter o pacote do Prettier nas dependências de desenvolvimento:&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;devDependencies&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prettier&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;^2.8.3&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;h2&gt;
  
  
  Setup inicial do Prettier
&lt;/h2&gt;

&lt;p&gt;Agora que nos certificamos de ter o pacote instalado no nosso projeto, inseriremos as primeiras regras de sintaxe. Para isso, devemos criar um arquivo chamado &lt;code&gt;.prettierrc&lt;/code&gt; na raíz do projeto.&lt;/p&gt;

&lt;p&gt;Vamos inserir algumas regras básicas nele:&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="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;semi&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;singleQuote&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;printWidth&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tabWidth&lt;/span&gt;&lt;span class="dl"&gt;"&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;bracketSpacing&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que cada uma dessas regras fazem?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;semi - Insere ponto e vírgula ao final de declarações&lt;/li&gt;
&lt;li&gt;singleQuote - Strings devem ser incluídas por padrão em aspas simples&lt;/li&gt;
&lt;li&gt;printWidth - Especifica o tamanho máximo de linha no código&lt;/li&gt;
&lt;li&gt;tabWidth - As tabulações terão por padrão um espaçamento de tamanho 2&lt;/li&gt;
&lt;li&gt;bracketSpacing - Valores dentro de chaves (&lt;code&gt;{}&lt;/code&gt;) virão espaçados&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Você pode conferir essas e outras regras nas &lt;a href="https://prettier.io/docs/en/index.html" rel="noopener noreferrer"&gt;documentações do Prettier&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando o Prettier através da linha de comando
&lt;/h2&gt;

&lt;p&gt;Já temos tudo pronto para testar o funcionamento do Prettier. Se você está adicionando o Prettier a um projeto já existente, você pode rodar o comando diretamente e ver se ele funciona de acordo com as regras que você estabeleceu. Mas caso esteja começando um projeto novo e fazendo o setup do Prettier, iremos testar criando um arquivo em &lt;code&gt;src/index.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;É um arquivo simples para testar as configurações do Prettier. Iremos inserir apenas o seguinte 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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;testPrettier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;isso é um teste do prettier&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;Para que o Prettier faça sua mágica, adicionaremos o comando de correção no nosso arquivo &lt;code&gt;package.json&lt;/code&gt;. Caso não haja o objeto &lt;code&gt;scripts&lt;/code&gt;, use o exemplo abaixo para adicionar no seu &lt;code&gt;package.json&lt;/code&gt;. Mas caso já possua, só adicione o comando &lt;code&gt;format&lt;/code&gt;:&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="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;scripts&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;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prettier-format&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;prettier --write 'src/**/*.{js,jsx,ts,tsx,css,json}' --config ./.prettierrc&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;Agora execute o comando usando o seu gerenciador de pacotes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;npm:&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;npm run prettier-format&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;yarn
&amp;gt; yarn prettier-format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Olhando novamente para o arquivo &lt;code&gt;src/index.js&lt;/code&gt;, a nossa variável deverá estar formatada assim:&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;const&lt;/span&gt; &lt;span class="nx"&gt;testPrettier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;isso é um teste do prettier&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;Voilá! Temos nosso código formatado do jeitinho que queríamos. Mas não acaba por aí porque o tópico a seguir vai mudar a sua vida!&lt;/p&gt;

&lt;h2&gt;
  
  
  Usando o Prettier através do VSCode diretamente
&lt;/h2&gt;

&lt;p&gt;Até então, o que foi feito aqui já é uma grande ajuda em termos de correção de sintaxe e padronização de código. Mas a maior vantagem do Prettier vem agora: A integração com o VSCode!&lt;/p&gt;

&lt;p&gt;Através dela, o código &lt;em&gt;será formatado automaticamente sem a necessidade do uso de comandos&lt;/em&gt;. Isso mesmo. Então vamos por a mão na massa e ver o funcionamento na prática.&lt;/p&gt;

&lt;p&gt;O primeiro passo para fazer essa integração é ir na aba de extensões do VSCode (penúltimo ícone ou apenas Cmd + Shift + X ou CTRL + Shift + X) e procurar pela extensão do Prettier. Basta instalar e ela será adicionada ao seu VSCode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FPrettier%2Fresources%2Fasset1.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FPrettier%2Fresources%2Fasset1.png%3Fraw%3Dtrue" alt="prettier image" width="628" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O segundo passo é adicionar o Prettier como o editor padrão do VSCode. Para isso abra o menu &lt;code&gt;arquivo&lt;/code&gt;&amp;gt;&lt;code&gt;preferências&lt;/code&gt;&amp;gt;&lt;code&gt;configurações&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No campo de busca procure por &lt;code&gt;formatter&lt;/code&gt; (ou formatador) e selecione o Prettier como formatador padrão do VSCode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FPrettier%2Fresources%2Fasset2.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FPrettier%2Fresources%2Fasset2.png%3Fraw%3Dtrue" alt="prettier image" width="745" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por último, faremos com que o Prettier execute nossas regras automaticamente toda vez que salvarmos um arquivo ou colarmos um código no nosso projeto. Para isso, abriremos o arquivo de preferências em JSON do VSCode através do comando CTRL + Shift + P e selecionaremos para abrir o arquivo JSON:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FPrettier%2Fresources%2Fasset3.png%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FPrettier%2Fresources%2Fasset3.png%3Fraw%3Dtrue" alt="prettier image" width="587" height="84"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Neste arquivo, adicionaremos duas configurações novas: O &lt;code&gt;editor.formatOnSave&lt;/code&gt; e o &lt;code&gt;editor.formatOnPaste&lt;/code&gt;, como no exemplo 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="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editor.formatOnPaste&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editor.formatOnSave&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se tudo der certo, seu Prettier estará integrado com o VSCode, lendo as regras do arquivo &lt;code&gt;.prettierrc&lt;/code&gt; na pasta raíz do seu projeto e aplicando essas regras toda vez que você salvar um arquivo ou colar um código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bônus
&lt;/h2&gt;

&lt;p&gt;No arquivo JSON de preferências você pode determinar regras para linguagens específicas. Por exemplo, desativar a correção ao salvar e colar para arquivos &lt;code&gt;typescript&lt;/code&gt;, 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="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editor.formatOnPaste&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editor.formatOnSave&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[typescript]&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editor.formatOnPaste&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;editor.formatOnSave&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Espero que este artigo sirva de guia para uma primeira configuração do prettier e que agora seu código se torne mais legível e bonito!&lt;/p&gt;

&lt;p&gt;Teve algum problema? Comenta aqui em baixo!&lt;/p&gt;

&lt;p&gt;Se este link foi útil pra você ou você quer apoiar o meu trabalho,&lt;br&gt;
deixa seu like ou estrelinha aí e compartilhe ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8hobqfwk3srzb7ruo43.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc8hobqfwk3srzb7ruo43.gif" alt="Deixa seu like aí!!!" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links úteis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://prettier.io/docs/en/index.html" rel="noopener noreferrer"&gt;Documentação do Prettier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/alantsx/Artigos/blob/main/Prettier/resources/.prettierrc" rel="noopener noreferrer"&gt;Arquivo .prettierrc com regras básicas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>javascript</category>
      <category>typescript</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Entendendo Callbacks no JavaScript</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Wed, 26 Oct 2022 13:18:53 +0000</pubDate>
      <link>https://forem.com/alanfabricio/entendendo-callbacks-no-javascript-28e0</link>
      <guid>https://forem.com/alanfabricio/entendendo-callbacks-no-javascript-28e0</guid>
      <description>&lt;p&gt;Escrevi um artigo sobre Promises e Async / Await, recentemente, na intenção de contribuir com a comunidade BR e solidificar meus conhecimentos. No entanto, é impossível falar de Promises sem antes desenrolar um assunto fundamental: &lt;strong&gt;As Callbacks&lt;/strong&gt;. Se você tem a intenção de entender melhor como funciona o JavaScript de forma assíncrona, este é o primeiro passo.&lt;/p&gt;

&lt;p&gt;Então vamos nessa? Simbora.&lt;/p&gt;

&lt;h2&gt;
  
  
  O funcionamento do JavaScript
&lt;/h2&gt;

&lt;p&gt;Imagine uma sequência de instruções qualquer, como uma receita de bolo. Para fazer o bolo, basta seguirmos cada passo dessa receita na ordem correta, certo?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Misturar as gemas, açúcar e margarina
2. Acrescentar leite, fermento e farinha de trigo
3. Despejar a massa numa forma
4. Assar a 180ºC por 40 minutos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O JavaScript funciona de maneira similar. Uma sequência de instruções do algoritmo será executada na ordem de cima para baixo.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt; &lt;span class="p"&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="nf"&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;Essa mensagem vem por primeiro&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&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="nf"&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;Essa mensagem vem por segundo&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="nf"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="c1"&gt;// Essa mensagem vem por primeiro&lt;/span&gt;
&lt;span class="c1"&gt;// Essa mensagem vem por segundo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A semântica do Callback
&lt;/h2&gt;

&lt;p&gt;É comum que a execução de código siga uma determinada ordem. Vejamos um outro exemplo. Dessa vez utilizaremos a função &lt;code&gt;setTimeout&lt;/code&gt; para fazer com que a primeira mensagem demore 3 segundos para ser exibida. Vamos ver o resultado?&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt; &lt;span class="p"&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="nf"&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;Essa mensagem vem por primeiro&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F1.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F1.gif%3Fraw%3Dtrue" alt="primeira Mensagem" width="688" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você tem alguma ideia do que pode ter causado este erro? Na verdade, eu gostaria que você observasse duas coisas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A função &lt;code&gt;primeiraMensagem&lt;/code&gt; é executada automaticamente, sem a espera dos 3 segundos&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;setTimeout&lt;/code&gt; lança um erro de &lt;em&gt;callback inválida&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quando executamos &lt;code&gt;primeiraMensagem()&lt;/code&gt;, com os parênteses no final, faz com que a função seja &lt;strong&gt;Invocada&lt;/strong&gt;. Ou seja, ordenamos a execução imediata da mesma. E quando o setTimeout procurou o que havia no primeiro parâmetro, não encontrou nada (recebeu undefined), já que &lt;code&gt;primeiraMensagem&lt;/code&gt; já havia sido executada.&lt;/p&gt;

&lt;p&gt;Para entender completamente, vamos para um exemplo parecido, mas dessa vez retirando os parênteses no final de &lt;code&gt;primeiraMensagem()&lt;/code&gt;.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt; &lt;span class="p"&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="nf"&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;Essa mensagem vem por primeiro&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F2.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F2.gif%3Fraw%3Dtrue" alt="primeira Mensagem funcionando" width="640" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Voilá! O que entendemos disso? No cenário acima existe uma diferença semântica na função &lt;code&gt;primeiraMensagem&lt;/code&gt; de passá-la como argumento, sem os parênteses. Estas são as famosas &lt;strong&gt;&lt;em&gt;callbacks&lt;/em&gt;&lt;/strong&gt;. Ou seja, ela &lt;strong&gt;não está sendo invocada diretamente, e sim sendo passada como parâmetro para que outra função, a &lt;code&gt;setTimeout&lt;/code&gt;, a chame (CALL) novamente (BACK)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Neste segundo exemplo, podemos passar uma função como callback para que a função &lt;code&gt;recebeCallback&lt;/code&gt; possa chamar (e executar) essa função dentro dela.&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;function&lt;/span&gt; &lt;span class="nf"&gt;recebeCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callbackRecebida&lt;/span&gt;&lt;span class="p"&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;numeroAleatorio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;101&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;callbackRecebida&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numeroAleatorio&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;imprimeValor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valorParaImprimir&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valorParaImprimir&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;recebeCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imprimeValor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F3.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F3.gif%3Fraw%3Dtrue" alt="callback gif 3" width="636" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A função &lt;code&gt;imprimeValor&lt;/code&gt; será responsável somente por imprimir o valor que recebe como parâmetro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A função &lt;code&gt;recebeCallback&lt;/code&gt; será invocada recebendo &lt;code&gt;imprimeValor&lt;/code&gt; como callback e assim seguirá:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gerar um número aleatório de 1 a 100;&lt;/li&gt;
&lt;li&gt;Invocar a callback &lt;code&gt;imprimeValor&lt;/code&gt; recebida como parâmetro que consequentemente imprimirá no console o número aleatório&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Usando o JavaScript assíncrono com as callbacks
&lt;/h2&gt;

&lt;p&gt;Aprendemos como passar funções como callbacks, agora vamos entender a maior vantagem das callbacks: a utilização do Javascript de maneira assíncrona!&lt;/p&gt;

&lt;p&gt;O próximo exemplo reutiliza as duas funções do início do artigo &lt;code&gt;primeiraMensagem()&lt;/code&gt; e &lt;code&gt;segundaMensagem()&lt;/code&gt;. Na função &lt;code&gt;primeiraMensagem()&lt;/code&gt; configuramos uma espera de 3 segundos para execução e logo em seguida iremos chamar a função &lt;code&gt;segundaMensagem()&lt;/code&gt;. Qual deverá ser o output? Vamos ver.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt; &lt;span class="p"&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="nf"&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;Essa mensagem vem por primeiro&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&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="nf"&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;Essa mensagem vem por segundo&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Output:&lt;/span&gt;
&lt;span class="c1"&gt;// Essa mensagem vem por segundo&lt;/span&gt;
&lt;span class="c1"&gt;// ... 5 segundos depois&lt;/span&gt;
&lt;span class="c1"&gt;// Essa mensagem vem por primeiro&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F4.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F4.gif%3Fraw%3Dtrue" alt="callback gif 4" width="622" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O que aconteceu? Se o código é sempre executado de cima para baixo, por que o JavaScript não esperou que a primeira mensagem fosse exibida antes da segunda?&lt;/p&gt;

&lt;p&gt;Neste caso o JavaScript leu o código corretamente, executou a ação dos 3 segundos para exibir a mensagem e &lt;strong&gt;continuou a execução de forma síncrona do restante do código&lt;/strong&gt;. Ou seja, ele leu &lt;code&gt;setTimeout&lt;/code&gt;, mandou a execução acontecer e continuou a ler a próxima linha de código que neste caso foi &lt;code&gt;segundaMensagem()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mas esse não é o output que queríamos, certo? Queríamos que &lt;code&gt;segundaMensagem()&lt;/code&gt; fosse executada somente após &lt;code&gt;primeiraMensagem()&lt;/code&gt;. E se fizéssemos uma modificação? Vamos incluir &lt;code&gt;segundaMensagem()&lt;/code&gt; como callback de &lt;code&gt;primeiraMensagem()&lt;/code&gt; e fazer com que essa callback seja executada 2 segundos depois da execução da primeira.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&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="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="nf"&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;Essa mensagem vem por primeiro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&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="nf"&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;Essa mensagem vem por segundo&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora sim, desta forma &lt;code&gt;segundaMensagem()&lt;/code&gt; só será executada 2 segundos após a execução de &lt;code&gt;primeiraMensagem()&lt;/code&gt;. Vamos para o output?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F5.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F5.gif%3Fraw%3Dtrue" alt="callback gif 5" width="718" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ué, o erro de undefined novamente? Se olharmos com atenção notaremos que cometemos um erro fatal. Ao passarmos &lt;code&gt;segundaMensagem&lt;/code&gt; como callback de &lt;code&gt;primeiraMensagem&lt;/code&gt;, abrimos os parêtenses de &lt;code&gt;primeiraMensagem&lt;/code&gt; fazendo com que essa seja executada imediatamente e deixasse de ser passada como callback.&lt;/p&gt;

&lt;p&gt;Então como fazer com que ainda que passando &lt;code&gt;segundaMensagem&lt;/code&gt; como parâmetro, consigamos manter &lt;code&gt;primeiraMensagem&lt;/code&gt; como callback? Neste caso usaremos as &lt;strong&gt;funções anônimas&lt;/strong&gt;, também conhecidas como &lt;strong&gt;arrow functions&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  Uma rápida explicação de função anônima
&lt;/h3&gt;

&lt;p&gt;Escreverei um artigo em mais detalhes sobre funções anônimas em breve, mas por enquanto só entenda que:&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;function&lt;/span&gt; &lt;span class="nf"&gt;funcaoNaoAnonima&lt;/span&gt;&lt;span class="p"&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="nf"&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;Este é um exemplo de uma função não anônima&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;Pode ser transcrita também da seguinte forma:&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="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="nf"&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;Este é um exemplo de função anônima&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;De volta ao assunto.&lt;/p&gt;




&lt;p&gt;Ao criar uma função anônima que tem como única utilidade retornar a invocação de &lt;code&gt;primeiraMensagem&lt;/code&gt;, podemos manter &lt;code&gt;primeiraMensagem&lt;/code&gt; em sua forma de callback.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&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="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="nf"&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;Essa mensagem vem por primeiro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&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="nf"&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;Essa mensagem vem por segundo&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="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F6.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F6.gif%3Fraw%3Dtrue" alt="callback gif 6" width="610" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora sim! Neste caso a função anônima será a chave para destrancarmos o poder das callbacks. Para mergulhar um pouco mais afundo nessa maravilhosa funcionalidade, iremos adicionar um último degrau de complexidade em nossos exemplos. Dessa vez faremos com que &lt;code&gt;segundaMensagem&lt;/code&gt; também receba um parâmetro. Neste caso será a mensagem que gostaríamos de imprimir no console.&lt;/p&gt;

&lt;p&gt;Primeiro vamos escrever da forma "errada", para entendermos a correta.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&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="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="nf"&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;Essa mensagem vem por primeiro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Essa mensagem vem por segundo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Não precisamos nem executar o código acima para vermos o erro de passarmos &lt;code&gt;segundaMensagem()&lt;/code&gt; com os parênteses, estaremos dando uma ordem de execução e desestruturando a callback. Neste caso também usaremos a função anônima para permitir que passemos um parâmetro dentro de &lt;code&gt;segundaMensagem()&lt;/code&gt;.&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&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="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="nf"&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;Essa mensagem vem por primeiro&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Essa mensagem vem por segundo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F7.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F7.gif%3Fraw%3Dtrue" alt="callback gif 7" width="722" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O problema do uso das Callbacks: O Callback Hell
&lt;/h2&gt;

&lt;p&gt;Através das callbacks, somos capazes de manipular a ordem de execução das funções. Até aqui os exemplos foram simples e didáticos. No entanto, o mundo real é mais complicado e algumas aplicações se tornam complexas.&lt;/p&gt;

&lt;p&gt;O uso das callbacks em projetos complexos cria um problema de legibilidade de código e torna seu uso mais difícil, quer ver? Vamos para um exemplo onde temos 5 funções que imprimem mensagens, uma sendo executada 2 segundos depois da outra e recebendo a mensagem como parâmetro. Como essas funções seriam escritas normalmente?&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;function&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&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="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;segundaMensagem&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="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;terceiraMensagem&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="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;quartaMensagem&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="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;setTimeout&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;quintaMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mensagem&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;primeiraMensagem&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="nf"&gt;segundaMensagem&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="nf"&gt;terceiraMensagem&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="nf"&gt;quartaMensagem&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="nf"&gt;quintaMensagem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Quinta mensagem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Quarta mensagem&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Terceira mensagem&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Segunda mensagem&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Primeira mensagem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F8.gif%3Fraw%3Dtrue" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Falantsx%2FArtigos%2Fblob%2Fmain%2FCallbacks%2Fresouces%2F8.gif%3Fraw%3Dtrue" alt="callback gif 8" width="618" height="758"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Veja que a medida que são adicionadas novas chamadas de callbacks, a complexidade irá aumentar e a compreensão do código ficará mais difícil. Em casos mais extremos seu código vai parecer que foi cortado ao meio pelo Hadouken do Ryuu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Falantsx%2FArtigos%2Fmain%2FCallbacks%2Fresouces%2Fcallback%2520hell.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Falantsx%2FArtigos%2Fmain%2FCallbacks%2Fresouces%2Fcallback%2520hell.jpg" alt="callback gif 3" width="800" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Felizmente existe uma maneira de evitar que esse tipo de problema aconteça. E estamos falando das Promises! E para a conveniência de todos, eu tenho um &lt;a href="https://dev.to/alanfabricio/introducao-a-promises-async-await-no-javascript-4pjm"&gt;artigo explicando o assunto&lt;/a&gt; também!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Ufa! Chegamos ao final, e tenho certeza que daqui pra frente Callback é um assunto mais claro para você. Agora é só praticar!&lt;/p&gt;

&lt;p&gt;Agradecimentos e crédito à &lt;a href="https://www.youtube.com/watch?v=cNjIUSDnb9k" rel="noopener noreferrer"&gt;Ania Kubów&lt;/a&gt; e &lt;a href="https://youtu.be/6lbBaM18X3g" rel="noopener noreferrer"&gt;Mario Souto&lt;/a&gt; que também dão excelentes explicações acerca do assunto.&lt;/p&gt;

&lt;p&gt;Agradecimentos também aos meus colegas &lt;a href="https://github.com/elissonmichael" rel="noopener noreferrer"&gt;Élisson Michael&lt;/a&gt; e &lt;a href="https://github.com/edgardleal" rel="noopener noreferrer"&gt;Edgard Leal&lt;/a&gt; pelas sugestões e revisão.&lt;/p&gt;

&lt;p&gt;Teve algum problema? Comenta aqui em baixo!&lt;/p&gt;

&lt;p&gt;Se este link foi útil pra você ou você quer apoiar o meu trabalho,&lt;br&gt;
deixa seu like aí e compartilhe ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlrnwevz9o7h0h5d14x4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlrnwevz9o7h0h5d14x4.gif" alt="Deixa seu like aí!!!" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>beginners</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introdução a Promises, Async / Await no JavaScript</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Wed, 20 Jul 2022 04:47:30 +0000</pubDate>
      <link>https://forem.com/alanfabricio/introducao-a-promises-async-await-no-javascript-4pjm</link>
      <guid>https://forem.com/alanfabricio/introducao-a-promises-async-await-no-javascript-4pjm</guid>
      <description>&lt;p&gt;Sabe a sensação de nunca ter entendido um assunto importantíssimo da maneira como deveria? Pois é. Sou eu com &lt;em&gt;Promises&lt;/em&gt;. Neste sentido, resolvi escrever esse artigo para que entendamos com calma do que se trata essas tais promessas.&lt;/p&gt;

&lt;p&gt;Mas antes de entrar nesse tópico, é de fundamental importância entender como funcionam as &lt;code&gt;callbacks&lt;/code&gt; no JavaScript. Felizmente, eu já tenho um artigo sobre isso que você pode conferir &lt;a href="https://dev.to/alanfabricio/entendendo-callbacks-no-javascript-28e0"&gt;aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Então vamos ao assunto!&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são as Promises, afinal?
&lt;/h2&gt;

&lt;p&gt;Promise é uma ferramenta extremamente útil e muito usada em JavaScript pois permite que se execute uma sequência de comandos de forma assíncrona. Em outras palavras, permite executar duas partes do seu código ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Neste sentido, você terá diversas vantagens como manipular o seu código de maneira mais eficiente, manipular os dados em chamadas de APIs e tratar os erros de maneira mais limpa.&lt;/p&gt;

&lt;p&gt;Vamos a um exemplo de uma sequência de comandos síncrona (tradicional) de uma função que soma dois números e retorna uma outra função com a resposta:&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;function&lt;/span&gt; &lt;span class="nf"&gt;sumNumbers&lt;/span&gt;&lt;span class="p"&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;successCallback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;errorCallback&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;successCallback&lt;/span&gt;&lt;span class="p"&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="nf"&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;Funcionou. A soma de 1 + 1 é 2&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;errorCallback&lt;/span&gt;&lt;span class="p"&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="nf"&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;Oops! Algo deu errado.&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="nf"&gt;sumNumbers&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// output: Funcionou. A soma de 1 + 1 é 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos refazer o código anterior para que desta vez ele retorne uma Promise. Esta Promise simplificará o uso dos &lt;em&gt;callbacks&lt;/em&gt;, veja só.&lt;/p&gt;

&lt;p&gt;Para isso, se cria um &lt;code&gt;new&lt;/code&gt; Promise, que é uma classe que retornará um objeto. Na criação desta classe passaremos como parâmetro uma função anônima, que por sua vez receberá os parâmetros &lt;code&gt;resolve&lt;/code&gt; e &lt;code&gt;reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ficou confuso? Calma que no exemplo ficará mais claro, mas por enquanto atente-se a esses parâmetros &lt;code&gt;resolve&lt;/code&gt;e &lt;code&gt;reject&lt;/code&gt;. O que esses parâmetros querem dizer? Querem dizer que se o código correr da maneira como deveria, ele executará o trecho &lt;code&gt;resolve&lt;/code&gt; do código. Caso algum erro aconteça, ele executará o trecho &lt;code&gt;reject&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esses caras &lt;code&gt;resolve&lt;/code&gt; e &lt;code&gt;reject&lt;/code&gt; são o que chamamos de &lt;strong&gt;&lt;em&gt;callbacks&lt;/em&gt;&lt;/strong&gt;.&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;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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;let&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Success&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed&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;Por enquanto entramos somente na parte da criação da Promise, agora vamos chamá-la. com o .then, podemos forçar que o código só prossiga com a execução da função após que uma anterior seja resolvida. Veremos isso mais à frente, mas por enquanto se atente a forma como fazemos a chamada da Promise:&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="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;message&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="nf"&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;Esse é o then: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;err&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="nf"&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;Esse é o catch: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// output: Esse é o then: Success&lt;/span&gt;

&lt;span class="c1"&gt;// Caso mudássemos a condicional a == 2 para qualquer outro valor, provavelmente o output seria o do catch:&lt;/span&gt;
&lt;span class="c1"&gt;// output: Esse é o catch: Failed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Criando Promises
&lt;/h3&gt;

&lt;p&gt;Por enquanto vimos os conceitos básicos de promise como por exemplo usá-las através do .then e .catch, mas vamos adicionar uma pitada de complexidade e tentar ir para um exemplo mais robusto de como fazer com que qualquer função retorne uma Promise.&lt;/p&gt;

&lt;p&gt;Neste caso temos duas &lt;a href="https://developer.mozilla.org/pt-BR/docs/Glossary/Callback_function" rel="noopener noreferrer"&gt;funções callbacks síncronas&lt;/a&gt; chamadas &lt;code&gt;errorCallback&lt;/code&gt; e &lt;code&gt;callback&lt;/code&gt;. Elas retornarão um objeto com a propriedade &lt;code&gt;name&lt;/code&gt; e &lt;code&gt;message&lt;/code&gt;. Uma função comum com sua chamada seria algo assim:&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;const&lt;/span&gt; &lt;span class="nx"&gt;myName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;whoAreYouCallback&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="nx"&gt;errorCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myName&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alan&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="nf"&gt;errorCallback&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Algo deu errado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; não é meu nome.&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;callback&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Olá, mundo!&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;span class="nf"&gt;whoAreYouCallback&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="nf"&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="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;? Sou eu! &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&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;error&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;. &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// output: Alan? Sou eu! Olá, mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora para retornar uma promise, você verá que não precisaremos adicionar os &lt;code&gt;errorCallback&lt;/code&gt; e &lt;code&gt;callback&lt;/code&gt; nos parâmetros da função, apenas faremos com que essa função retorne uma Promise diretamente.&lt;/p&gt;

&lt;p&gt;Para retornar uma promise, adicionamos o &lt;code&gt;return new Promise(função anônima)&lt;/code&gt; com as &lt;strong&gt;&lt;em&gt;callbacks&lt;/em&gt;&lt;/strong&gt; de parâmetro da função anônima.&lt;/p&gt;

&lt;p&gt;Para a chamada de Promise, adicionamentos o &lt;code&gt;.then&lt;/code&gt; para tratar o cenário de sucesso e o &lt;code&gt;.catch&lt;/code&gt; para o cenário de falha:&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;const&lt;/span&gt; &lt;span class="nx"&gt;myName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alan&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;whoAreYouCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myName&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Alan&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="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Algo deu errado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myName&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; não é meu nome.&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;myName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Olá, mundo!&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;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;whoAreYouCallback&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&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="nf"&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="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;? Sou eu! &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;. &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// output: Alan? Sou eu! Olá, mundo!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  O superpoder da Promise: Determinando a ordem de chamada das funções
&lt;/h3&gt;

&lt;p&gt;Agora que sabemos usar as Promises, podemos ativar o seu &lt;em&gt;superpoder&lt;/em&gt;: Fazer com que o código prossiga somente após a execução de uma determinada promise e permitindo que você controle a ordem e quando fará a execução do seu código. Neste sentido, basta aninharmos o próximo &lt;code&gt;.then&lt;/code&gt; sendo passado como parâmetro no resultado da promise anterior.&lt;/p&gt;

&lt;p&gt;Neste exemplo vamos criar duas promises e chamaremos através do método tradicional .then/.catch:&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;// Criando a primeira promise&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bestF1DriverEver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Senna&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="nf"&gt;resolve &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;driverName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ayrton Senna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; é o melhor piloto de F1 de todos os tempos!&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="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;reject &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Esse não é o melhor piloto!&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;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Criando a segunda promise&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;bestF1Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;reject&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;McLaren MP4/4 pilotada por &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;driverName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Resposta errada! Tente de novo&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;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Chamando uma promise e depois a outra&lt;/span&gt;

&lt;span class="nf"&gt;bestF1DriverEver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Senna&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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="nf"&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;Verificando resposta...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;bestF1Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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="nf"&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;Encontrando o melhor carro...&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&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="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="c1"&gt;// output: Verificando resposta...&lt;/span&gt;
&lt;span class="c1"&gt;// output: Encontrando o melhor carro...&lt;/span&gt;
&lt;span class="c1"&gt;// output: McLaren MP4/4 pilotada por Ayrton Senna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se caso quiséssemos criar mais chamadas consecutivas de promises para executar o código em uma determinada ordem somente após o término da execução de uma outra função anterior, basta adicionarmos mais &lt;code&gt;.then&lt;/code&gt; na chamada retornando a promise anteriormente usada, como foi o caso da &lt;code&gt;return bestF1Car(response)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;No exemplo anterior, vimos que a segunda promise confere se o resultado da primeira promise foi um sucesso. Caso positivo, ela também seguirá no cenário de sucesso.&lt;/p&gt;

&lt;p&gt;Porém, essa chamada de promise acaba gerando um problema: A partir da chamada de mais de uma promise, vai-se criando um aninhamento de &lt;code&gt;.then&lt;/code&gt; retornando a próxima promise. Em uma chamada de muitas promises, isso pode tornar o código complexo e ilegível.&lt;/p&gt;

&lt;h2&gt;
  
  
  Async / Await
&lt;/h2&gt;

&lt;p&gt;Para resolver o problema da complexidade de aninhamentos de &lt;code&gt;.then&lt;/code&gt;, o &lt;code&gt;async / await&lt;/code&gt; vem para simplificar o trabalho de chamada de promises.&lt;/p&gt;

&lt;p&gt;O primeiro passo é explicitar que a função será assíncrona adicionando o prefixo &lt;code&gt;async&lt;/code&gt; na chamada das promises, para então chamar as promises desejadas na ordem que desejada de execução utilizando o prefixo &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Com as duas promises criadas no exemplo anterior, poderíamos chamá-las dessa forma:&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runPromises&lt;/span&gt;&lt;span class="p"&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;bestF1DriverResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bestF1DriverEver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Senna&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bestF1DriverResponse&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;bestF1CarResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bestF1Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bestF1DriverResponse&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bestF1CarResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;runPromises&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// output: {&lt;/span&gt;
&lt;span class="c1"&gt;//  "success": true,&lt;/span&gt;
&lt;span class="c1"&gt;//  "driverName": "Ayrton Senna",&lt;/span&gt;
&lt;span class="c1"&gt;//  "msg": "Senna é o melhor piloto de F1 de todos os tempos!"&lt;/span&gt;
&lt;span class="c1"&gt;//}&lt;/span&gt;

&lt;span class="c1"&gt;// output: McLaren MP4/4 pilotada por Ayrton Senna&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E caso o parâmetro passado faça cair no erro .catch da promise? Neste caso, é necessário envelopar nossas chamadas dentro de um bloco &lt;code&gt;try / catch&lt;/code&gt; para fazer o tratamento do erro.&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runPromises&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// chamando a promise com o parâmetro errado&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;bestF1DriverResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bestF1DriverEver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Piquet&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bestF1DriverResponse&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;bestF1CarResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;bestF1Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bestF1DriverResponse&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bestF1CarResponse&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&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="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Como o parâmetro passado foi errado, ele cairá neste bloco catch&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;runPromises&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// output: Esse não é o melhor piloto!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O uso do &lt;code&gt;async / await&lt;/code&gt; junto com &lt;code&gt;try / catch&lt;/code&gt; é uma grande vantagem pois o &lt;code&gt;try / catch&lt;/code&gt; irá capturar erros de promise no &lt;code&gt;reject&lt;/code&gt; como também pode capturar outros erros também.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guia Rápido
&lt;/h2&gt;

&lt;h3&gt;
  
  
  O que é uma promise?
&lt;/h3&gt;

&lt;p&gt;É um objeto que "encapsula" o estado de uma execução (sucesso ou falha) e executa callbacks com base neste estado.&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual é a relação entre &lt;code&gt;Promise&lt;/code&gt; e &lt;code&gt;callback&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;As callbacks são parâmetros dentro da função de uma promise que são responsáveis para designar como a promise irá se comportar dependendo do seu resultado. As duas principais callbacks usadas são &lt;em&gt;&lt;code&gt;resolve&lt;/code&gt;&lt;/em&gt; e &lt;em&gt;&lt;code&gt;reject&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Resolve&lt;/code&gt;: Se a promise funcionar como esperada, essa callback irá retornar a sequência de resolução do código.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;Reject&lt;/code&gt;: Se a promise não funcionar como esperada, essa callback irá retornar um erro para a chamada da promise.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Qual é a relação entre &lt;code&gt;Promise&lt;/code&gt; e &lt;code&gt;Async / Await&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Async / Await&lt;/code&gt; é uma forma mais simples de se chamar promises. Para usá-los, nós precisamos ter uma promise criada, uma função com o prefixo &lt;code&gt;async&lt;/code&gt; onde será inserida as chamadas da promise com o prefixo &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que &lt;code&gt;Async / Await&lt;/code&gt; faz com nosso código?
&lt;/h3&gt;

&lt;p&gt;Irá executar o bloco &lt;code&gt;.then&lt;/code&gt; sem a necessidade de aninhá-los para cada chamada de promise, tornando o código mais legível. Além disso, para tratar erros apropriadamente, é importante que envolva as chamadas da promises &lt;code&gt;await&lt;/code&gt; em torno de um bloco &lt;code&gt;try / catch&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Existe algo a mais para saber sobre promises?
&lt;/h3&gt;

&lt;p&gt;Sim, recentemente o Node.JS teve um update com o &lt;code&gt;Promise.all&lt;/code&gt; para chamar várias promises em ainda menos linhas de código.&lt;/p&gt;

&lt;p&gt;Ah, e nunca se esqueça que você pode sempre contar com o &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise" rel="noopener noreferrer"&gt;MDN Docs&lt;/a&gt; para aprender de uma fonte confiável!&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Acredito que a partir daqui cobrimos os principais tópicos acerca de Promises e Async/Await. Agora é só praticar!&lt;/p&gt;

&lt;p&gt;Agradecimentos ao meu techlead, &lt;a href="https://github.com/edgardleal" rel="noopener noreferrer"&gt;Edgard Leal&lt;/a&gt;, que sempre me apoia em meus estudos e me incentiva a ser um profissional melhor.&lt;/p&gt;

&lt;p&gt;Agradecimentos também ao pessoal do &lt;a href="https://www.youtube.com/c/codigofontetv" rel="noopener noreferrer"&gt;Código Fonte TV&lt;/a&gt;, que com os vídeos me deram uma base importantíssima para o conteúdo deste artigo.&lt;/p&gt;

&lt;p&gt;Teve algum problema? Comenta aqui em baixo!&lt;/p&gt;

&lt;p&gt;Se este link foi útil pra você ou você quer apoiar o meu trabalho,&lt;br&gt;
deixa seu like aí e compartilhe ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlrnwevz9o7h0h5d14x4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlrnwevz9o7h0h5d14x4.gif" alt="Deixa seu like aí!!!" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>promises</category>
      <category>async</category>
      <category>await</category>
    </item>
    <item>
      <title>[Iniciante, JavaScript] Desafio Avançando Dias: Praticando Arrays, Loops e Funções</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Wed, 01 Sep 2021 22:41:19 +0000</pubDate>
      <link>https://forem.com/alanfabricio/iniciante-javascript-desafio-avancando-dias-praticando-arrays-loops-e-funcoes-2a8p</link>
      <guid>https://forem.com/alanfabricio/iniciante-javascript-desafio-avancando-dias-praticando-arrays-loops-e-funcoes-2a8p</guid>
      <description>&lt;p&gt;Recentemente estava ajudando um amigo a resolver um exercício de Javascript que usava fundamentos interessantes não só da linguagem mas como da própria lógica de programação.&lt;/p&gt;

&lt;p&gt;São fundamentos básicos porém importantes e que, se bem aplicados, serão de grande ajuda para quem está iniciando sua jornada na programação.&lt;/p&gt;

&lt;p&gt;Por isso, resolvi trazer a explicação do desafio aqui, destrinchando os conceitos utilizados de forma didática e resolvendo o exercício passo a passo&lt;/p&gt;

&lt;h2&gt;
  
  
  O Problema
&lt;/h2&gt;

&lt;p&gt;Desenvolva uma função que avance os dias da semana, retornando o dia da semana que corresponda a um dia inicial mais a quantidade de dias avançado por um número inteiro. Tanto o dia inicial quanto a quantidade de dias avançados deverão ser passados por parâmetro.&lt;/p&gt;

&lt;p&gt;Neste sentido, tanto o parâmetro de dia inicial como o retorno do dia da semana deverão ser String no formato "Sexta-feira", "Quinta-feira", "Sábado"... Validações de formato não são necessárias.&lt;/p&gt;

&lt;p&gt;Por exemplo: Os parâmetros passados são "Terça-feira" e 5. A função deverá avançar cinco dias e retornar "Domingo". Ou então como parâmetro é passado "Quarta-feira" e 8. A função deverá avançar oito dias da semana e retornar "Quinta-feira".&lt;/p&gt;

&lt;p&gt;Caso pretenda resolver por conta própria antes de ver a resolução, este é um bom momento para isso. Quando se sentir pronto, é só seguir com o artigo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F068uvke1cyf46bhctxk9.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F068uvke1cyf46bhctxk9.gif" alt="Let's go!" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A solução
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Montando a função
&lt;/h3&gt;

&lt;p&gt;Antes de mais nada deveremos montar a própria função. Neste caso, nossa função irá receber duas informações como parâmetro, o dia da semana inicial e a quantidade de dias a serem avançados.&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;function&lt;/span&gt; &lt;span class="nf"&gt;avancarDias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&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;h3&gt;
  
  
  2. Declaração do Array
&lt;/h3&gt;

&lt;p&gt;Aqui teremos todos os dias da semana em um único array. Neste sentido, quando quisermos retornar um dia específico, devemos apenas retornar a posição do Array que corresponda ao dia em questã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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;avancarDias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&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;diasSemana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Segunda-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Terca-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quarta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quinta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sexta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sabado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domingo&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;Com isso, se quisermos acessar "Segunda-feira", basta acessarmos a posição zero do array diasSemana (&lt;em&gt;diasSemana[0]&lt;/em&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Parâmetro &lt;strong&gt;&lt;em&gt;dia&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Para o primeiro parâmetro, dia da semana, ele deverá ser recebido como String no mesmo formato dos dias da semana como escritos no Array (&lt;strong&gt;&lt;em&gt;por exemplo: dia receberá "Quinta-feira"&lt;/em&gt;&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Mas como indicar para a nossa função que o parâmetro dia "Quinta-feira" corresponde à quarta posição do array (&lt;em&gt;diasSemana[3]&lt;/em&gt;)?&lt;/p&gt;

&lt;p&gt;Para isso, usaremos um método do JavaScript chamado &lt;strong&gt;&lt;em&gt;indexOf&lt;/em&gt;&lt;/strong&gt;. O que ele faz? Bom, &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf" rel="noopener noreferrer"&gt;é sempre bom ler alguma documentação explicativa&lt;/a&gt; mas basicamente o indexOf irá receber um valor e procurar este valor no array. Caso seja encontrado, ele irá retornar o índice ao qual corresponda a este valor.&lt;/p&gt;

&lt;p&gt;Em outras palavras, ele irá procurar no nosso array &lt;em&gt;diasSemana&lt;/em&gt; pelo valor que foi passado no parâmetro &lt;em&gt;dia&lt;/em&gt;. Caso encontre, retornará a posição do mesmo no array, ou retornará -1 caso não encontre.&lt;/p&gt;

&lt;p&gt;A aplicação prática seria assim:&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;function&lt;/span&gt; &lt;span class="nf"&gt;avancarDias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&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;diasSemana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Segunda-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Terca-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quarta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quinta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sexta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sabado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domingo&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;indiceDia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diasSemana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&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;Caso o parâmetro &lt;strong&gt;&lt;em&gt;dia&lt;/em&gt;&lt;/strong&gt; receba &lt;strong&gt;&lt;em&gt;"Quinta-feira"&lt;/em&gt;&lt;/strong&gt;, o método indexOf irá procurar no array &lt;strong&gt;&lt;em&gt;diasSemana&lt;/em&gt;&lt;/strong&gt; e irá retornar o índice onde encontra-se quinta-feira (3) já que &lt;strong&gt;&lt;em&gt;diasSemana[3] = "Quinta-feira"&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Caso ainda tenha ficado alguma dúvida de como funciona o indexOf, &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf" rel="noopener noreferrer"&gt;recomendo esta documentação do Mozilla Web Docs&lt;/a&gt;. Mas caso esteja acompanhando, vamos para o próximo ponto!&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Parâmetro &lt;strong&gt;&lt;em&gt;quantidade&lt;/em&gt;&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Agora precisamos tratar o parâmetro de quantidade de dias a serem avançados. Neste sentido, precisamos fazer uma lógica que consiga fazer a quantidade de dias avançados percorrer o nosso array em &lt;strong&gt;loop&lt;/strong&gt;. Ou seja, depois de atingir a última posição, ele volta para a primeira. Mas como fazer isso?&lt;/p&gt;

&lt;p&gt;Como já disse antes, usaremos um loop!&lt;/p&gt;

&lt;p&gt;Para que a quantidade não ultrapasse o tamanho do Array, o nosso loop irá diminuir por 7 (quantidade de dias da semana) toda vez que a quantidade for maior ou igual aos próprios dias da semana. Neste sentido se &lt;em&gt;quantidade&lt;/em&gt; recebe 42, o loop fará:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;43-7 = 36

&lt;ul&gt;
&lt;li&gt;Em seguida:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;36 - 7 = 29

&lt;ul&gt;
&lt;li&gt;Em seguida:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;29 - 7 = 22

&lt;ul&gt;
&lt;li&gt;Em seguida:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;22 - 7 = 15

&lt;ul&gt;
&lt;li&gt;Em seguida:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;15 - 7 = 8

&lt;ul&gt;
&lt;li&gt;Em seguida:&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;8 - 7 = 1&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Ou seja, nossa lógica fará com que avancemos 43 dias. Começando por uma segunda-feira, avançando 43 dias, o dia final será uma terça-feira!&lt;/p&gt;

&lt;p&gt;Em código, o loop ficará da seguinte forma:&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;function&lt;/span&gt; &lt;span class="nf"&gt;avancarDias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&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;diasSemana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Segunda-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Terca-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quarta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quinta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sexta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sabado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domingo&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;indiceDia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diasSemana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;quantidade&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;quantidade&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;7&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;h3&gt;
  
  
  5. Juntando os dois parâmetros
&lt;/h3&gt;

&lt;p&gt;Agora que temos a lógica de cada parâmetro pronta, podemos juntá-los. A partir de um dia inicial (parâmetro &lt;em&gt;dia&lt;/em&gt;), avançamos uma quantidade e dias (parâmetro &lt;em&gt;quantidade&lt;/em&gt;) e retornamos o dia da semana em questão. Para isso, basta somarmos os dois índices (tanto o &lt;em&gt;indiceDia&lt;/em&gt; quanto o &lt;em&gt;quantidade&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;O resultado será a posição certa no array que indica o dia final após os cálculos. A função, finalmente, só precisará retornar este valor!&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;function&lt;/span&gt; &lt;span class="nf"&gt;avancarDias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&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;diasSemana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Segunda-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Terca-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quarta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quinta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sexta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sabado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domingo&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;indiceDia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diasSemana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&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;indiceAtualizado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;indiceDia&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;indiceAtualizado&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;indiceAtualizado&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;;&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;diasSemana&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;indiceAtualizado&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;h3&gt;
  
  
  6. Refinando o código
&lt;/h3&gt;

&lt;p&gt;Um último toque de acabamento para o código ficar bonito, podemos substituir o número de dias fixo da semana (7) pelo tamanho do Array, já que caso o índice seja maior do que o array, subtraia pelo seu próprio tamanho.&lt;/p&gt;

&lt;p&gt;Neste caso o 7 poderia ser substituído por &lt;strong&gt;&lt;em&gt;diasSemana.length&lt;/em&gt;&lt;/strong&gt;, já que o tamanho do Array é o próprio 7.&lt;/p&gt;

&lt;p&gt;Finalizando, o código ficaria:&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;function&lt;/span&gt; &lt;span class="nf"&gt;avancarDias&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&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;diasSemana&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Segunda-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Terca-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quarta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Quinta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sexta-feira&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Sabado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Domingo&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;indiceDia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;diasSemana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dia&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;indiceAtualizado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;indiceDia&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;quantidade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;indiceAtualizado&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;diasSemana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;indiceAtualizado&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="nx"&gt;diasSemana&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&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;diasSemana&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;indiceAtualizado&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;h3&gt;
  
  
  7. Desafio completo!
&lt;/h3&gt;

&lt;p&gt;Apesar de ser um código de apenas 11 linhas, muitos conceitos importantes de JavaScript e lógica de programação são aplicados. Se você conseguiu otimizar esse código ainda mais, me mande sua sugestão que eu ficaria satisfeito em receber!&lt;/p&gt;

&lt;p&gt;No mais, se você aprendeu alguma coisa com este artigo ou achou útil, deixe aquele ❤️ ou salve 🔖 nos seus favoritos. Ficarei feliz também em receber eventuais feedbacks ou caso tenha &lt;strong&gt;ficado com alguma dúvida&lt;/strong&gt;, pode me mandar uma mensagem no meu &lt;a href="https://www.instagram.com/alanpfabricio/" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt; ou &lt;a href="https://www.linkedin.com/in/alantsx/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Github do Projeto: &lt;a href="https://github.com/alantsx/diaSemana" rel="noopener noreferrer"&gt;https://github.com/alantsx/diaSemana&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;See ya later!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6rh39l8krqdcfuzrl5j.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo6rh39l8krqdcfuzrl5j.gif" alt="Byebye" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>arrays</category>
      <category>function</category>
      <category>loops</category>
    </item>
    <item>
      <title>Atualizando seu projeto no GitHub</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Sat, 25 Jul 2020 03:19:02 +0000</pubDate>
      <link>https://forem.com/alanfabricio/atualizando-seu-projeto-no-github-3ap8</link>
      <guid>https://forem.com/alanfabricio/atualizando-seu-projeto-no-github-3ap8</guid>
      <description>&lt;h3&gt;
  
  
  Um passo a passo rápido para você subir a nova versão do seu projeto do GitHub
&lt;/h3&gt;

&lt;p&gt;Uma das formas mais eficientes de mostrar que você é um programador ativo é fazendo uploads no GitHub. Afinal, não tem nada mais &lt;em&gt;cool&lt;/em&gt; do que ver o seu perfil cheio dos quadradinhos verdes.&lt;/p&gt;

&lt;p&gt;O problema é que muitos iniciantes só sobem o projeto no GitHub quando ele está pronto e acabam perdendo a oportunidade de não só fazer o backup do progresso do trabalho como também de manter o seu perfil sempre ativamente alimentado. Então hoje eu resolvi falar sobre esse método muito simples para você manter os seus projetinhos do GitHub sempre atualizados junto com os arquivos locais. &lt;/p&gt;

&lt;p&gt;Antes de mais nada, se você quer aprender a fazer um repositório &lt;strong&gt;novo&lt;/strong&gt; no GitHub, &lt;a href="https://dev.to/alanfabricio/subindo-seu-repositorio-no-github-atraves-da-linha-de-comando-3kcm"&gt;segue este tutorial aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Bom, mãos à obra!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9nofm4pik3l1ece0joy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9nofm4pik3l1ece0joy.gif" alt="Japonês pronto pra te hackear estalando os dedos" width="439" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Tenha certeza que o seu git está instalado. No terminal ou prompt de comando cheque através do comando &lt;code&gt;git -v&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abra o Git Bash ou terminal na pasta onde está o seu projeto. &lt;strong&gt;Presume-se que o repositório já esteja iniciado no GitHub, mesmo que apenas com o ReadMe&lt;/strong&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adicione todos os arquivos para serem validados como upload através do comando &lt;code&gt;git add .&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se o seu projeto local já possuir uma URL de origem definida pule este passo. Se não possuir, como é o caso de você iniciar um repositório sem fazer upload de arquivos ou somente com um ReadMe, você pode definir uma. Para isso, vá no repositório criado e no botão Code copie a URL que é disponibilizada:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funlz5tilt617dc517gca.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Funlz5tilt617dc517gca.jpg" alt="copiando URL do repositório" width="464" height="362"&gt;&lt;/a&gt;&lt;br&gt;
Posteriormente execute &lt;code&gt;git remote add origin URL-DO-REPOSITÓRIO&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incorpore as mudanças do seu projeto remoto com seu projeto local utilizando &lt;code&gt;git pull origin master&lt;/code&gt;.&lt;br&gt;
&lt;em&gt;Dica&lt;/em&gt;: Você pode checar quais arquivos sofreram mudanças e serão upados através do comando &lt;code&gt;git status&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confirme as alterações entre o projeto remoto e o projeto local usando o comando &lt;code&gt;git commit -m "descrição do commit"&lt;/code&gt;;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jogue o projeto para a nuvem usando &lt;code&gt;git push origin master&lt;/code&gt;. O terminal irá pedir o seu login e senha do GitHub para realizar esse processo e você finalmente terá seu projeto atualizado.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Teve algum problema? Comenta aqui em baixo!&lt;/p&gt;

&lt;p&gt;Se este link foi útil pra você ou você quer apoiar o meu trabalho,&lt;br&gt;
deixa seu like aí e compartilhe ❤️&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlrnwevz9o7h0h5d14x4.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlrnwevz9o7h0h5d14x4.gif" alt="Deixa seu like aí!!!" width="480" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>git</category>
      <category>atualizando</category>
      <category>projeto</category>
    </item>
    <item>
      <title>[BotTelegram PT.2] Criando seu próprio bot no Telegram usando NodeJS + Deploy na nuvem via Heroku</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Sat, 04 Jul 2020 22:26:38 +0000</pubDate>
      <link>https://forem.com/alanfabricio/bottelegram-pt-2-criando-seu-proprio-bot-no-telegram-usando-nodejs-deploy-na-nuvem-via-heroku-1fh</link>
      <guid>https://forem.com/alanfabricio/bottelegram-pt-2-criando-seu-proprio-bot-no-telegram-usando-nodejs-deploy-na-nuvem-via-heroku-1fh</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/soralan/bottelegram-pt-1-criando-seu-proprio-bot-no-telegram-usando-nodejs-deploy-na-nuvem-via-heroku-4ig8"&gt;Na parte anterior iniciamos&lt;/a&gt; o setup básico e a primeira funcionalidade de um bot no Telegram usando a API do NodeJS. Neste tutorial faremos o deploy do bot usando uma hospedagem grátis com o Heroku.&lt;/p&gt;

&lt;p&gt;Então partiu pro código.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhkehgrthjsk0hktgjux.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyhkehgrthjsk0hktgjux.gif" alt="hackerman" width="360" height="202"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. O que precisaremos?
&lt;/h3&gt;

&lt;p&gt;1.1 &lt;a href="https://git-scm.com/book/en/v2/Getting-Started-Installing-Git" rel="noopener noreferrer"&gt;Git instalado&lt;/a&gt;;&lt;/p&gt;

&lt;p&gt;1.2 Cadastro no &lt;a href="https://devcenter.heroku.com/" rel="noopener noreferrer"&gt;Heroku&lt;/a&gt; feito;&lt;/p&gt;

&lt;p&gt;1.3 &lt;a href="https://devcenter.heroku.com/articles/heroku-cli" rel="noopener noreferrer"&gt;Cliente do Heroku&lt;/a&gt; instalado;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Configurações prévias: Comando start
&lt;/h3&gt;

&lt;p&gt;Quando sua aplicação sobe para o Heroku, ele possui um &lt;em&gt;modus operandis&lt;/em&gt; padrão de executar o comando &lt;code&gt;npm start&lt;/code&gt;. O que acontece é que sem uma configuração prévia o seu bot simplesmente não vai abrir o index.js, já que o comando para que ele rode seja &lt;code&gt;node index.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Então para resolver isso é muito simples, nós iremos fazer um script que executará &lt;code&gt;node index.js&lt;/code&gt; quando o comando &lt;code&gt;npm start&lt;/code&gt; rodar.&lt;/p&gt;

&lt;p&gt;No seu arquivo &lt;strong&gt;package.json&lt;/strong&gt; procure pela parte de script e adicione o script &lt;code&gt;"start": "node index.js"&lt;/code&gt;. Caso o script não exista, você pode criar em formato JSON. Ele deve ficar mais ou menos assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtqmvnksgu1l2p0pzdw9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frtqmvnksgu1l2p0pzdw9.jpg" alt="package.json" width="697" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Configurações prévias: Express e direcionamento de portas
&lt;/h3&gt;

&lt;p&gt;Para que seu bot fique online sem problemas no Heroku, você precisa dizer para a hospedagem na nuvem quais portas utilizar. Caso contrário, o Heroku simplesmente desliga a sua aplicação. Neste sentido, a melhor dependência que resolva esse problema é o &lt;strong&gt;Express&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Então com o terminal aberto dentro da pasta da sua aplicação adicionaremos o Express como dependência:&lt;br&gt;
&lt;code&gt;npm install express&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Dentro do seu arquivo principal (nesse tutorial o &lt;em&gt;index.js&lt;/em&gt;) importe o express usando &lt;code&gt;var express = require('express');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Inicie a função do express com &lt;code&gt;var app     = express();&lt;/code&gt; e vamos fazer a configuração das portas:&lt;/p&gt;

&lt;p&gt;Como o Heroku fornece dinâmicamente a porta à ser utilizada pelo app, usaremos o método &lt;em&gt;process.env.PORT&lt;/em&gt; para capturar a porta passada pelo Heroku OU então caso a porta não seja passada usaremos uma porta padrão: &lt;br&gt;
&lt;code&gt;app.set('port', (process.env.PORT || 5000));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Também podemos criar um log para dizer em qual porta a aplicação estará rodando:&lt;br&gt;
&lt;code&gt;app.get('/', function(request, response) {&lt;br&gt;
    var result = 'App is running'&lt;br&gt;
    response.send(result);&lt;br&gt;
}).listen(app.get('port'), function() {&lt;br&gt;
    console.log('App is running, server is listening on port ', app.get('port'));&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://help.heroku.com/P1AVPANS/why-is-my-node-js-app-crashing-with-an-r10-error" rel="noopener noreferrer"&gt;Você pode conferir um artigo do FAQ do Heroku em inglês explicando melhor sobre o uso do Express com o Heroku&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Fazendo o deploy para o Heroku
&lt;/h3&gt;

&lt;p&gt;Finalmente nossa aplicação está pronta e bonita para ir online! Então com o seu terminal aberto na pasta do seu projeto vamos iniciar a última etapa.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2gnonb3x0zf3cakcdtx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz2gnonb3x0zf3cakcdtx.gif" alt="Coringa doido para soltar o bot na nuvem" width="480" height="196"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.1 Com a sua conta no Heroku criada, execute o comando no terminal &lt;code&gt;heroku login&lt;/code&gt;, siga os passos para fazer o login na plataforma;&lt;/p&gt;

&lt;p&gt;4.2 Execute &lt;code&gt;heroku create&lt;/code&gt; para criar uma nova aplicação no Heroku (frisando mais uma vez que o terminal precisa estar na pasta da aplicação);&lt;/p&gt;

&lt;p&gt;4.3 Execute &lt;code&gt;heroku config:set TOKEN=Token_unico_da_sua_aplicação_fornecida_pelo_BotFather&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E depois execute &lt;code&gt;heroku config:set HEROKU_URL=$(heroku info -s | grep web_url | cut -d= -f2)&lt;/code&gt; para configurar o ambiente;&lt;/p&gt;

&lt;p&gt;4.4 O padrão agora é parecido com &lt;a href="https://dev.to/soralan/subindo-seu-repositorio-no-github-atraves-da-linha-de-comando-3kcm"&gt;fazer o upload de repositórios para o github usando o git&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;4.4.1 Para usar o git para subir os arquivos comece selecionando todos os arquivos da pasta com &lt;code&gt;git add .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4.4.2 Faça o commit com &lt;code&gt;git commit -m "primeiro commit"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4.4.3 Finalmente jogue para a pasta root da sua aplicação no Heroku com &lt;code&gt;git push heroku master&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;4.4.4 Seja feliz com o seu bot rodando na nuvem&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5n8ienszfjhw3oav8brv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5n8ienszfjhw3oav8brv.png" alt="Received your message" width="297" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Outras informações importantes
&lt;/h3&gt;

&lt;p&gt;5.1 Caso você venha a ter algum erro com o seu bot, você pode checar os últimos logs do console usando o comando &lt;code&gt;heroku logs&lt;/code&gt;, o que pode te auxiliar a resolver eventuais problemas;&lt;/p&gt;

&lt;p&gt;5.2 Esse método de deploy é totalmente grátis e, por consequência, existem limitações. Você possui um limite de mais ou menos 600 horas por mês com a sua aplicação rodando online e ela entrará em modo soneca após 30 minutos de inatividade. Existem métodos para adicionar mais horas sem pagar nada e adicionar addons que permitem o seu bot não entrar em modo soneca, mas fica para um outro tutorial.&lt;/p&gt;

&lt;p&gt;5.3 Caso você venha a ter um erro de "deprecated Automatic enabling of cancellation of promises is deprecated", tente adicionar o comando &lt;code&gt;process.env.NTBA_FIX_319 = 1;&lt;/code&gt; na primeira linha do seu index.js. Ou só adicione isso para se prevenir deste erro.&lt;/p&gt;

&lt;p&gt;5.4 Se este link lhe foi útil, deixe seu ❤️&lt;/p&gt;




&lt;p&gt;Alan Pereira&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/sor-alan/" rel="noopener noreferrer"&gt;Meu LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/sor-alan" rel="noopener noreferrer"&gt;Meu GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.instagram.com/alanpefab/" rel="noopener noreferrer"&gt;Meu Instagram&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>telegram</category>
      <category>bot</category>
      <category>heroku</category>
    </item>
    <item>
      <title>[BotTelegram PT.1] Criando seu próprio bot no Telegram usando NodeJS + Deploy na nuvem via Heroku</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Mon, 15 Jun 2020 00:13:06 +0000</pubDate>
      <link>https://forem.com/alanfabricio/bottelegram-pt-1-criando-seu-proprio-bot-no-telegram-usando-nodejs-deploy-na-nuvem-via-heroku-4ig8</link>
      <guid>https://forem.com/alanfabricio/bottelegram-pt-1-criando-seu-proprio-bot-no-telegram-usando-nodejs-deploy-na-nuvem-via-heroku-4ig8</guid>
      <description>&lt;p&gt;Bots são uma das ferramentas incríveis do Telegram que o faz se destacar entre os aplicativos de troca de mensagem instantânea. Entre seus muitos usos, os bots podem ser utilizados para:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Envio automático e customizado de mensagens, áudios, arquivos, links (uma forma de ter notícias customizadas de forma automática direto pelo Telegram, por exemplo);&lt;/li&gt;
&lt;li&gt;Integrar com diversos serviços como email, música, youtube;&lt;/li&gt;
&lt;li&gt;Aceitar pagamentos;&lt;/li&gt;
&lt;li&gt;Criar jogos... &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Enfim, basicamente os bots no Telegram são limitados apenas pela imaginação, criatividade e habilidade de seu criador. Diante dessa utilidade e da minha pretensão clara de converter o maior número possível de pessoas para essa plataforma incrível, eu resolvi começar essa série de tutoriais onde estarei abordando como desenvolver o seu próprio bot e inserir diversas funcionalidades interessantes usando NodeJS. Então sem mais delongas, mãos à obra!&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configurando o ambiente
&lt;/h3&gt;

&lt;p&gt;1.1 Talvez isso pareça óbvio, mas vai mesmo assim: Você precisa ter o NodeJS instalado. Caso não o tenha, &lt;a href="https://nodejs.org/" rel="noopener noreferrer"&gt;visite o site oficial&lt;/a&gt;, e configure o seu Node;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como opção para usuários de Ubuntu, &lt;a href="https://dev.to/soralan/como-instalar-a-ultima-versao-lts-do-nodejs-no-ubuntu-1pl6"&gt;segue um tutorial meu de como instalar o Node versão LTS&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;1.2 Crie a pasta do seu projeto e o arquivo principal nela, para mim ele se chamará &lt;em&gt;index.js&lt;/em&gt;;&lt;/p&gt;

&lt;p&gt;1.3 Abra o terminal na pasta e instale &lt;a href="https://github.com/yagop/node-telegram-bot-api" rel="noopener noreferrer"&gt;esta API que usaremos como base&lt;/a&gt; executando o comando:&lt;br&gt;
&lt;code&gt;npm install --save node-telegram-bot-api&lt;/code&gt;;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Pedindo a benção do Botfather
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7n84six5p40odaytqcdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7n84six5p40odaytqcdk.png" alt="The Bot Father" width="400" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Em sua plena ironia, o Telegram possui um bot para a criação de bots. O Botfather é responsável pela criação, edição e gerenciamento de todos os bots. Então tudo que envolva o seu bot dentro de opções do Telegram, você trata direto com ele.&lt;/p&gt;

&lt;p&gt;2.1 Dentro do seu Telegram abra uma conversa com &lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;;&lt;/p&gt;

&lt;p&gt;2.2 Para iniciar a conversa com o Botfather, use o comando &lt;code&gt;/start&lt;/code&gt;. Uma lista de opções aparecerá para você;&lt;/p&gt;

&lt;p&gt;2.3 O comando &lt;code&gt;/newbot&lt;/code&gt; irá iniciar uma série de diálogos para a criação do seu bot. Você deverá fornecer o nome e o username (@) do bot;&lt;/p&gt;

&lt;p&gt;2.4 Ao final da criação, ele irá te fornecer um TOKEN único para o Bot. Este é uma espécie de senha. &lt;strong&gt;Ele é indivudal e a chave para controlar todas as configurações e tudo que o Bot pode fazer, então mantenha esse TOKEN seguro com você&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hora do código
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugz2n225ax292u8ovamq.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugz2n225ax292u8ovamq.gif" alt="gato codando" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3.1 Primeiro vá no seu arquivo index.js. Puxaremos a dependência do node-telegram-bot-api:&lt;br&gt;
&lt;code&gt;const TelegramBot = require('node-telegram-bot-api');&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3.2 Segundo inseriremos o TOKEN fornecido pelo BotFather:&lt;br&gt;
&lt;code&gt;const TOKEN = 'seu-token-aqui';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3.3 Agora podemos finalmente criar o objeto TelegramBot:&lt;br&gt;
&lt;code&gt;const bot = new TelegramBot( TOKEN, { polling: true });&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Primeira funcionalidade e rodando o bot
&lt;/h3&gt;

&lt;p&gt;Agora o bot está pronto para rodar, basta fazermos as funcionalidades que desejamos. &lt;/p&gt;

&lt;p&gt;4.1 Como primeira funcionalidade para teste, o bot responderá de volta a qualquer mensagem:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;//Função 'Mensagem recebida'&lt;br&gt;
bot.on('message', (msg) =&amp;gt; {&lt;br&gt;
  const chatId = msg.chat.id;&lt;br&gt;
  bot.sendMessage(chatId, 'Mensagem recebida');&lt;br&gt;
});&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Onde:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;bot.on&lt;/code&gt; é quando o bot perceberá o evento;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;'message'&lt;/code&gt; o evento a ser percebido;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;(msg)&lt;/code&gt; o parâmetro que foi enviado;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;const chatId = msg.chat.id&lt;/code&gt; o bot identifica o id do chat para responder no chat correto;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bot.sendMessage(chatId, 'Mensagem recebida')&lt;/code&gt; a função enviar mensagem que receberá o ID do chat e enviará de volta a mensagem 'Mensagem recebida`&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5n8ienszfjhw3oav8brv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5n8ienszfjhw3oav8brv.png" alt="Received your message" width="297" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4.2 Para rodarmos o bot, vá no Terminal de comando na pasta do projeto e execute o index.js atráves do:&lt;br&gt;
&lt;code&gt;node index.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Por hoje é isso! As próximas partes do tutorial irão abordar a hospedagem grátis do Heroku e mais funcionalidades para o bot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/soralan/bottelegram-pt-2-criando-seu-proprio-bot-no-telegram-usando-nodejs-deploy-na-nuvem-via-heroku-1fh"&gt;Você pode conferir a Parte 2 aqui!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outros links que podem ser úteis para desenvolver bots no Telegram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/yagop/node-telegram-bot-api" rel="noopener noreferrer"&gt;GitHub oficial da API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://core.telegram.org/bots/api" rel="noopener noreferrer"&gt;Documentação Oficial do Telegram sobre a utilização do Bot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hosein2398/node-telegram-bot-api-tutorial" rel="noopener noreferrer"&gt;Este tutorial que aborda outras funcionalidades&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Se este link lhe foi útil, deixe seu ❤️&lt;/p&gt;

&lt;p&gt;Alan Pereira&lt;br&gt;
&lt;a href="https://www.linkedin.com/in/sor-alan/" rel="noopener noreferrer"&gt;Meu LinkedIn&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/sor-alan" rel="noopener noreferrer"&gt;Meu GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.instagram.com/alanpefab/" rel="noopener noreferrer"&gt;Meu Instagram&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bot</category>
      <category>telegram</category>
      <category>heroku</category>
      <category>node</category>
    </item>
    <item>
      <title>Subindo seu repositório no GitHub através da linha de comando</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Fri, 12 Jun 2020 00:53:06 +0000</pubDate>
      <link>https://forem.com/alanfabricio/subindo-seu-repositorio-no-github-atraves-da-linha-de-comando-3kcm</link>
      <guid>https://forem.com/alanfabricio/subindo-seu-repositorio-no-github-atraves-da-linha-de-comando-3kcm</guid>
      <description>&lt;h3&gt;
  
  
  Um passo a passo rápido para quem pretende subir o seu repositório no GitHub!
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Tenha certeza que o seu git está instalado. No terminal ou prompt de comando cheque através do comando &lt;code&gt;git -v&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No GitHub, crie um novo repositório. Na tela onde pede para fazer upload ou criar aquivos, guarde o link HTTPS que será gerado &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr559clq5k496dqark62.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcr559clq5k496dqark62.jpg" alt="GitHub" width="800" height="300"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abra o Git Bash ou terminal na pasta onde está o seu projeto&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Inicie a pasta como um repositório do Git através do comando:&lt;br&gt;
&lt;code&gt;git init&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Em seguida, adicione os arquivos de configuração para preparar o commit:&lt;br&gt;
&lt;code&gt;git add .&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Opcional:&lt;/em&gt; Adicione um arquivo readme caso não tenha iniciado o repositório com ele:&lt;br&gt;
&lt;code&gt;git add README.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie um novo commit para os arquivos que irá subir para o repositório:&lt;br&gt;
&lt;code&gt;git commit -m "first commit"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Suba seus arquivos utilizando a URL gerada no passo 2 no seguinte comando:&lt;br&gt;
&lt;code&gt;git remote add origin URL-GERADA-PELO-PASSO-2-AQUI&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Autorize o upload com seu login e senha:&lt;br&gt;
&lt;code&gt;git push -u origin master&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Se este link lhe foi útil, deixe seu ❤️.&lt;/p&gt;

</description>
      <category>github</category>
      <category>repositorio</category>
      <category>comando</category>
      <category>projeto</category>
    </item>
    <item>
      <title>Como instalar a última versão LTS do NodeJS no Ubuntu</title>
      <dc:creator>Alan Pereira</dc:creator>
      <pubDate>Thu, 11 Jun 2020 01:15:12 +0000</pubDate>
      <link>https://forem.com/alanfabricio/como-instalar-a-ultima-versao-lts-do-nodejs-no-ubuntu-1pl6</link>
      <guid>https://forem.com/alanfabricio/como-instalar-a-ultima-versao-lts-do-nodejs-no-ubuntu-1pl6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp47r5h0bj43nygid5gxx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp47r5h0bj43nygid5gxx.png" alt="Alt Text" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O interpretador de texto de JavaScript &lt;strong&gt;NodeJS&lt;/strong&gt; certamente é uma das melhores ferramentas para quem quer desenvolver para web e mobile. No entanto, um dos problemas que novos usuários de Ubuntu poderão se deparar é com a instalação padrão do Node pelo terminal que instala uma versão mais antiga do que a já publicada.&lt;/p&gt;

&lt;p&gt;Porém, utilizando o Personal Package Archive podemos resolver esse problema. Então, siga os 3 passos a seguir e não perca mais tempo para começar o seu projeto:&lt;/p&gt;

&lt;h1&gt;
  
  
  Adicione o Node.JS PPA
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Última Versão LTS:&lt;/strong&gt; Aqui você pode settar a instalação da ultima versão LTS do NodeJS na versão 12.X. Abra o terminal do Ubuntu e execute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install curl&lt;br&gt;
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Instale o Node.JS através do apt-get
&lt;/h1&gt;

&lt;p&gt;Agora com a versão para download configurada, podemos executar a instalação normalmente:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt-get install nodejs&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Verifique a versão do NodeJS e NPM
&lt;/h1&gt;

&lt;p&gt;Perfeito. Provavelmente tudo certo para rodar. Podemos conferir a versão instalada.&lt;/p&gt;

&lt;p&gt;O NodeJS vem por padrão com o gerenciador de pacotes NPM instalado. Então além de verificar a instalação correta do NodeJS, você também pode verificar que o NPM foi instalado:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node -v&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Output Esperado:&lt;/em&gt; &lt;strong&gt;v.12.14&lt;/strong&gt; ou maior&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm -v&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Output Esperado:&lt;/em&gt; &lt;strong&gt;v.6.12&lt;/strong&gt; ou maior&lt;/p&gt;




&lt;p&gt;Se este link lhe foi útil, deixe seu ❤️.&lt;/p&gt;

</description>
      <category>instalar</category>
      <category>node</category>
      <category>lts</category>
      <category>ubuntu</category>
    </item>
  </channel>
</rss>
