<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ramon Borges</title>
    <description>The latest articles on DEV Community by Ramon Borges (@ramonborges15).</description>
    <link>https://dev.to/ramonborges15</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%2F377045%2F462075ff-71f7-43e9-baa2-7afe80752249.png</url>
      <title>DEV Community: Ramon Borges</title>
      <link>https://dev.to/ramonborges15</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramonborges15"/>
    <language>en</language>
    <item>
      <title>Não deveria ser tão simples inserir um bug na sua aplicação e eu te conto o porquê</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Tue, 09 Jul 2024 22:33:58 +0000</pubDate>
      <link>https://dev.to/ramonborges15/nao-deveria-ser-tao-simples-inserir-um-bug-na-sua-aplicacao-e-eu-te-conto-o-porque-902</link>
      <guid>https://dev.to/ramonborges15/nao-deveria-ser-tao-simples-inserir-um-bug-na-sua-aplicacao-e-eu-te-conto-o-porque-902</guid>
      <description>&lt;p&gt;Quem nunca ouviu aquela história (fictícia ou não) do dev júnior que apagou a base de dados em produção? Ou quantos de nós ao implementar aquela nova melhoria, sem perceber inseriu um bug dentro da aplicação? Normalmente, a nossa primeira atitude é culpar ou a pessoa (quando ela comete o erro) ou a nós mesmos (quando nós cometemos o erro).&lt;/p&gt;

&lt;p&gt;Inserir bug em um sistema ou mesmo apagar os dados de produção não deveriam ser tarefas tão simples de realizar (você deve concordar comigo, não é mesmo?). Mas porque isso acontece?&lt;/p&gt;

&lt;h3&gt;
  
  
  Pessoas e Processos
&lt;/h3&gt;

&lt;p&gt;Acredito que a resposta para esta pergunta inicia no entendimento de que &lt;strong&gt;a maioria desses erros é primeiramente uma falha de processo e não de pessoas&lt;/strong&gt;. Observar as falhas a partir desse ponto de vista nos ajuda muito a encontrar a verdadeira causa do erro e evitá-las (ou pelo menos reduzí-las) no futuro. &lt;/p&gt;

&lt;p&gt;No livro “A Startup Enxuta”, Eric Ries apresenta uma declaração bem interessante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Se nosso processo de produção é tão frágil que você pode quebrá-lo logo no primeiro dia de trabalho, que vergonha por tornar isso tão fácil.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em outras palavras, &lt;strong&gt;não deveria ser tão simples inserir um bug na minha aplicação!&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Não chore o leite derramado, escreva testes!
&lt;/h3&gt;

&lt;p&gt;Ok Ramon, eu entendi que não pode ser tão fácil. Porém, será que existe um meio pelo qual eu posso dificultar o meu “eu futuro” ou até um colega de cometer o mesmo erro? Sim! E uma das maneiras seria: &lt;strong&gt;escrever testes para sua aplicação!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O desejo e urgência para corrigir esse bug deve ser o mesmo para evitar que a próxima pessoa repetisse o erro. Ao inserirmos testes na aplicação, nós estamos de alguma forma protegendo o nosso trabalho bem como o dos nossos colegas também. Ou seja, &lt;strong&gt;tornando o processo de inserir bugs mais difícil&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sempre que um novo bug é descoberto na aplicação, podemos criar um teste específico para detectá-lo. Dessa maneira, à medida que adicionamos mais testes, nosso sistema se torna progressivamente mais robusto e menos suscetível a erros. Percebeu que isso é muito mais produtivo que apenas criticar a pessoa ou até você mesmo?&lt;/p&gt;

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

&lt;p&gt;Enxergar os erros como oportunidades de melhoria no processo de desenvolvimento, nos permite identificar as causas reais e implementar soluções eficazes. A criação de testes é uma das estratégias poderosas para tornar o sistema mais robusto e resiliente a novos bugs, fortalecendo continuamente o processo de desenvolvimento de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Livro "A startup enxuta: Como usar a inovação contínua para criar negócios radicalmente bem-sucedidos" do Eric Ries.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>testing</category>
      <category>career</category>
      <category>developers</category>
    </item>
    <item>
      <title>Backup sem estresse: Como criar o dump do seu BD PostgreSQL no Docker de forma simples</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Mon, 27 Nov 2023 15:30:00 +0000</pubDate>
      <link>https://dev.to/ramonborges15/backup-sem-estresse-como-criar-o-dump-do-seu-bd-postgresql-no-docker-de-forma-simples-oml</link>
      <guid>https://dev.to/ramonborges15/backup-sem-estresse-como-criar-o-dump-do-seu-bd-postgresql-no-docker-de-forma-simples-oml</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Nesta postagem, exploraremos um guia prático para a criação de dumps de banco de dados PostgreSQL em contêineres Docker. Abordaremos o acesso ao container, a utilização do &lt;code&gt;pg_dump&lt;/code&gt; e a exportação dos dados para fora do contêiner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Acessar container Docker
&lt;/h2&gt;

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

&lt;p&gt;Para iniciar, é crucial acessar o contêiner que hospeda o banco de dados PostgreSQL. Você pode usar o comando &lt;code&gt;docker exec&lt;/code&gt; para entrar no ambiente do contêiner. Este comando executa um novo comando em um contêiner em execução.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; ID_CONTAINER /bin/bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;-it&lt;/code&gt; permite que você interaja com o terminal dentro do contêiner. O &lt;code&gt;ID_CONTAINER&lt;/code&gt; é o identificador do container que possui o banco de dados. O &lt;code&gt;/bin/bash&lt;/code&gt; permite que um shell Bash seja iniciado dentro do contêiner, o que proporciona uma interface de interação com o ambiente do contêiner.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerar Dump utilizando pg_dump
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/6AFldi5xJQYIo/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/6AFldi5xJQYIo/giphy.gif" alt="pátio de containers" width="400" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o acesso ao contêiner estabelecido, é hora de gerar o dump do banco de dados. Utilizaremos a ferramenta &lt;code&gt;pg_dump&lt;/code&gt;, que é padrão no PostgreSQL e oferece opções para personalizar o processo de backup. Para gerar o arquivo com o backup, execute o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pg_dump &lt;span class="nt"&gt;-U&lt;/span&gt; username &lt;span class="nt"&gt;-d&lt;/span&gt; dbname &lt;span class="nt"&gt;-f&lt;/span&gt; NOME_DO_ARQUIVO_DUMP.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-U username&lt;/code&gt;: Nome de usuário para conectar-se ao banco.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-d dbname&lt;/code&gt;: Especifica o nome do banco de dados ao qual deseja conectar-se.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-f file&lt;/code&gt;: Nome do arquivo que receberá o script com o dump.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Será solicitado a você a senha do banco de dados. Ao inserir a senha, o arquivo com o dump será exportado para o container. Mas, como eu tenho acesso a esse arquivo, que se encontra dentro do meu container?&lt;/p&gt;

&lt;h2&gt;
  
  
  Exportar arquivo para fora do container
&lt;/h2&gt;

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

&lt;p&gt;Após a conclusão do dump, sairemos do contêiner. Para isso, basta executar o comando &lt;code&gt;exit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Em seguida, utilizaremos o comando &lt;code&gt;cp&lt;/code&gt; para exportar o arquivo de dump do contêiner para o sistema de arquivos local. Para isso, basta executar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;cp &lt;/span&gt;idcontainer:/caminho/no/container/NOME_DO_ARQUIVO_DUMP.sql /caminho/no/host/local/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para facilitar o nosso entendimento, vou dar um exemplo. Digamos que você tem um container com id &lt;code&gt;6abfa0ee2d87&lt;/code&gt;, contendo o arquivo de dump &lt;code&gt;meu_dump_2023.sql&lt;/code&gt;, e você deseja exportar para o seu diretório local. Você deveria executar o seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;cp &lt;/span&gt;6abfa0ee2d87:meu_dump_2023.sql &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Com estes passos simples, você pode criar dumps de banco de dados PostgreSQL em ambientes Docker de maneira simples. Este processo é fundamental para a segurança e a continuidade dos dados, proporcionando uma abordagem prática e segura para backups em contêineres.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/reference/commandline/cp/" rel="noopener noreferrer"&gt;Docker cp - Documentação oficial do Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.docker.com/engine/reference/commandline/exec/" rel="noopener noreferrer"&gt;Docker exec - Documentação oficial do Docker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.postgresql.org/docs/current/app-pgdump.html" rel="noopener noreferrer"&gt;Pg Dump - Documentação oficial do PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>postgres</category>
      <category>devops</category>
      <category>database</category>
    </item>
    <item>
      <title>Nest JS: 4 motivos que me fizeram escolher este framework para o desenvolvimento de aplicações backend Node Js</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Tue, 16 May 2023 23:49:57 +0000</pubDate>
      <link>https://dev.to/ramonborges15/nest-js-4-motivos-que-me-fizeram-escolher-este-framework-para-o-desenvolvimento-de-aplicacoes-backend-node-js-1on7</link>
      <guid>https://dev.to/ramonborges15/nest-js-4-motivos-que-me-fizeram-escolher-este-framework-para-o-desenvolvimento-de-aplicacoes-backend-node-js-1on7</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Bom, estou escrevendo este post pois quero compartilhar um pouquinho sobre um framework que descobri esse ano. Estou trabalhando com ele a pouco tempo, mas desde do começo, já me chamou muita atenção. Gostaria de dizer para você quais foram os 4 principais motivos que me fizeram escolher este framework. Senhoras e Senhores, este é o Nest JS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas antes, o que é esse Nest JS?
&lt;/h2&gt;

&lt;p&gt;Nest JS é um framework de desenvolvimento &lt;strong&gt;back-end&lt;/strong&gt; em Node.js que utiliza conceitos e técnicas de programação orientada a objetos e programação funcional para criar aplicações escaláveis e modularizadas. Ele usa TypeScript como linguagem principal e possui uma arquitetura modular, com uma estrutura de pastas organizada que facilita a criação e manutenção de projetos complexos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Já ouvi falar de um tal de Next.js, é a mesma coisa?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Next&lt;/strong&gt; e o &lt;strong&gt;Nest&lt;/strong&gt; são coisas totalmente diferentes. &lt;strong&gt;Next.js&lt;/strong&gt; é um framework de desenvolvimento web em JavaScript, utilizado para criar aplicações front-end com React. &lt;strong&gt;Nest JS&lt;/strong&gt; é um framework de desenvolvimento &lt;strong&gt;back-end&lt;/strong&gt; em Node.js. O foco desse artigo é falar sobre o &lt;strong&gt;Nest JS&lt;/strong&gt; (o que tem o 's' 😅).&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspiração do Nest JS
&lt;/h2&gt;

&lt;p&gt;O Nest JS é inspirado em alguns dos conceitos e estruturas do Angular, como a injeção de dependência, os decoradores e os módulos. O criador do Nest JS, &lt;strong&gt;Kamil Myśliwiec&lt;/strong&gt;, também contribuiu para o desenvolvimento do Angular.&lt;/p&gt;

&lt;p&gt;No entanto, o Nest JS é voltado para o desenvolvimento de aplicações back-end em Node.js, enquanto o Angular é voltado para o desenvolvimento de aplicações front-end em JavaScript.&lt;/p&gt;

&lt;p&gt;Vamos finalmente para os motivos que me fizeram escolher o Nest JS, para implementar aplicações backend com Node JS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivo 1: Framework opinado
&lt;/h2&gt;

&lt;p&gt;Um &lt;strong&gt;framework opinado&lt;/strong&gt; é um framework que faz fortes suposições sobre qual as melhores práticas para desenvolvimento de software e arquitetura da sua aplicação.&lt;/p&gt;

&lt;p&gt;Seguir essas opiniões e convenções devem acelerar o tempo de desenvolvimento, já que agora, precisamos nos preocupar apenas com o desenvolvimento das regras de negócio. Isso também é conhecido como &lt;a href="https://facilethings.com/blog/en/convention-over-configuration" rel="noopener noreferrer"&gt;"Convention Over Configuration"&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Sem dúvida, essa característica foi essencial para mim, ao escolher o Nest JS. Imagina que você já teve contato com os conceitos de autorização e autenticação, mas nunca implementou um login do zero. A documentação do Nest JS, já te apresenta quais as boas práticas ao desenvolver esse tipo de funcionalidade. Não é ótimo?&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivo 2: Inversão de Controle/Injeção de dependência
&lt;/h2&gt;

&lt;p&gt;Por um período, utilizei uma biblioteca chamada Inversify. Ela permite inserir o conceito de Injeção de dependências/Inversão de controle dentro de uma aplicação Node. Demorei um bom tempo para entendê-la. O grande problema é que você precisava preencher alguns arquivos, sempre que criava uma nova classe que deveria ser injetada. Você fazia isso configurando dois arquivos dentro da aplicação (quantas vezes esqueci de adicionar as novas classes, e a aplicação não rodava kkk).&lt;/p&gt;

&lt;p&gt;Descobri que o Nest JS, já tinha por padrão o conceito de Injeção de dependências/Inversão de controle. Você só precisava fazer uma importação da classe em questão dentro da campo &lt;code&gt;providers&lt;/code&gt;e adicionar uma anotação &lt;code&gt;@Injectable()&lt;/code&gt;. Pronto! Você já era capaz de injetar uma classe dentro de um construtor.&lt;/p&gt;

&lt;p&gt;Sem dúvida, saber que o Nest já utilizava os conceitos de Inversão de Controle/Injeção de Dependência, me chamou atenção positivamente. &lt;/p&gt;

&lt;h2&gt;
  
  
  Motivo 3: Ótima documentação
&lt;/h2&gt;

&lt;p&gt;Pode ser apenas uma impressão minha, mas achei bem agradável e amigável essa documentação, principalmente para quem está começando com este framework. Não foi difícil entender as soluções apresentadas em cada seção. Basicamente, boa parte do que precisei implementar, consegui fazer utilizando apenas as informações da documentação do Nest JS. &lt;/p&gt;

&lt;p&gt;Ela conta com um repositório no github, que tem a implementação da maior parte dos conceitos explicados. Você tem acesso a implementação ao fim de cada capítulo (figura abaixo). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.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%2F2fhfnymle9c92ww63txc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.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%2F2fhfnymle9c92ww63txc.png" alt="Documentação do Nest JS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se quiser acessar o repositório com todas as implementações, &lt;a href="https://github.com/nestjs/nest" rel="noopener noreferrer"&gt;clique aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivo 4: Variedade de técnicas e receitas disponíveis
&lt;/h2&gt;

&lt;p&gt;Outro ponto a se destacar é que o Nest JS disponibiliza na sua documentação, uma série de técnicas e receitas. Você consegue implementar "todo" tipo de aplicação que imaginar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Técnicas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuração de envs, banco de dados, mongo, validação, caching, serialização, versionamento de API, agendamento de tasks, filas, logging, cookies, eventos, session, Graphql, Websockets, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Arquiteturas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices, MVCs, Monorepos, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Receitas:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Passport, Swagger, Health checks, CQRS, Prisma, Serve static, Automock, CRUD generator.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Descobri uma série de bibliotecas e conceitos que eram desconhecidos para mim, e que aumentaram o meu leque de opções como desenvolvedor (por exemplo, conceito de monorepo).&lt;/p&gt;

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

&lt;p&gt;Este artigo apresentou o Nest JS, um framework back-end escalável e modularizado em Node.js, que utiliza programação orientada a objetos e funcional. Destacou-se sua opinião, facilidade de injeção de dependência, ótima documentação e variedade de técnicas disponíveis.&lt;br&gt;
Em resumo, o Nest JS pode ser uma excelente escolha para desenvolvedores que buscam um framework robusto e produtivo para seus projetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nestjs.com/" rel="noopener noreferrer"&gt;Documentação oficial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nestjs</category>
      <category>node</category>
      <category>backend</category>
      <category>frameworks</category>
    </item>
    <item>
      <title>Dominando Promises em JavaScript: Encadeamento, Promise.all e tratamento de erros</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Fri, 28 Apr 2023 00:09:42 +0000</pubDate>
      <link>https://dev.to/ramonborges15/dominando-promises-em-javascript-encadeamento-promiseall-e-tratamento-de-erros-1ff5</link>
      <guid>https://dev.to/ramonborges15/dominando-promises-em-javascript-encadeamento-promiseall-e-tratamento-de-erros-1ff5</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Este é o nosso último post da série Ecmascript 6 (posso ouvir um aahhhhhh daqui 😆). Nessa segunda parte, falaremos um pouco sobre encadeamento de promises, execução de múltiplas promises utilizando o &lt;code&gt;.then()&lt;/code&gt; e uma dica de ouro ao utilizar promises. Vamos lá?!&lt;/p&gt;

&lt;h2&gt;
  
  
  Promise.all
&lt;/h2&gt;

&lt;p&gt;A função &lt;code&gt;Promise.all()&lt;/code&gt; permite executar &lt;strong&gt;&lt;u&gt;múltiplas promises simultaneamente&lt;/u&gt;&lt;/strong&gt; e retornar &lt;strong&gt;&lt;u&gt;um único valor&lt;/u&gt;&lt;/strong&gt; quando todas elas forem resolvidas. Isso é útil quando você precisa executar várias tarefas assíncronas e só deseja prosseguir quando todas elas tiverem sido concluídas.&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;promise1&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="o"&gt;=&amp;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="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;Promise 1 resolved&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;100&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;promise2&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="o"&gt;=&amp;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="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;Promise 2 resolved&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;promise1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;promise2&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;results&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;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Result: ["Promise 1 resolved", "Promise 2 resolved"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vale destacar que, se qualquer uma das promises passadas for rejeitada, &lt;code&gt;Promise.all&lt;/code&gt; assincronamente é rejeitada com o valor da promise rejeitada, independentemente se outras promises foram resolvidas.&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;promise1&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="o"&gt;=&amp;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="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;Promise 1 resolved&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;100&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;promise2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Promise&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="s2"&gt;Promise 2 rejected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;promise1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;promise2&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;results&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;results&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;e&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;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Result: Promise 2 rejected&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Encadeamento de promises
&lt;/h2&gt;

&lt;p&gt;O encadeamento de promises permite executar &lt;strong&gt;&lt;u&gt;uma série de tarefas assíncronas em uma ordem específica&lt;/u&gt;&lt;/strong&gt;. Isso é útil quando você precisa executar uma tarefa após a conclusão de outra tarefa assíncrona. Para organizar essa sequência, utilizamos o manipulador &lt;code&gt;.then()&lt;/code&gt;. É como se você chegasse para alguém dizendo: “Primeiramente, você precisa fazer isso, então faça aquilo, então faça esta outra coisa, então…, então…” e assim por diante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Atenção&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Não esqueça de escrever um retorno dentro do &lt;code&gt;.then()&lt;/code&gt;, caso contrário, ele não irá funcionar corretamente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos para um exemplo. Suponha que você precise buscar as informações do usuário e, em seguida, buscar as informações de seus pedidos. Você pode usar o encadeamento de promises para executar essas duas tarefas em ordem, esperando que a primeira seja concluída antes de executar a segunda.&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;fetchUserData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&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;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.example.com/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;fetchUserOrders&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&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;return&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://api.example.com/users/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/orders`&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="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nf"&gt;fetchUserData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="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;user&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;Dados do usuário:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&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;fetchUserOrders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&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;orders&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;Pedidos do usuário:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orders&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;error&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;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Ocorreu um erro:&lt;/span&gt;&lt;span class="dl"&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A nossa saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Dados do usuário: 
user: {
    // informações do usuário
}

Pedidos do usuário: 
orders: [
    {
        // informações do pedido 1
    },
    {
        // informações do pedido 2
    }
]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Erro handling
&lt;/h2&gt;

&lt;p&gt;Uma regra de ouro é: “Seja responsável e faça o tratamento de erros corretamente”. Imagine o seguinte código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;makeRequest&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&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;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="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="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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;try/catch&lt;/code&gt; não irá se capaz de lidar com o erro se o &lt;code&gt;JSON.parse&lt;/code&gt; falhar. Isso está acontecendo dentro da promise. Nós devemos chamar o .catch para conseguir tratar esse 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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;makeRequest&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&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;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="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="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="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="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="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;
  
  
  Finally handler
&lt;/h2&gt;

&lt;p&gt;Nós temos algo chamado finally handler, que é chamado independente se nossa promise foi resolvida ou rejeitada. Digamos que a promise abaixo seja rejeitada:&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="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;foo&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="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="s2"&gt;Consulta realizada com sucesso!&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="k"&gt;catch&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="s2"&gt;Erro ao consumir dados da API&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="k"&gt;finally&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="s2"&gt;Fim da requisição!&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;A nossa saída será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Erro ao consumir dados da API"
"Fim da requisição!"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Bom pessoal, este é o fim da nossa série sobre Ecmascript 6. Terminamos essa série trazendo mais algumas informações sobre promises. Verificamos o funcionamento do &lt;code&gt;Promise.all&lt;/code&gt;, que nos permite executar múltiplas promises simultaneamente. Também vimos a possibilidade de executar uma série de tarefas assíncronas em uma ordem específica, utilizando o encadeamento de promises. Além disso, lidamos com o tratamento de erros em promises de uma forma correta. Por fim, falamos sobre o finally, que nos permite executar algo independente se a nossa promise foi resolvida ou rejeitada. O que acho dessa série? Alguma sugestão? Nos vemos na próxima!&lt;/p&gt;

&lt;h2&gt;
  
  
  Para saber mais
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/succinctly-free-ebooks/ecmascript-6-succinctly" rel="noopener noreferrer"&gt;ECMAScript 6 Succinctly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream" rel="noopener noreferrer"&gt;JavaScript Async/Await Tutorial – Learn Callbacks, Promises, and Async/Await in JS by Making Ice Cream&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise/all" rel="noopener noreferrer"&gt;Promise.all()&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.educative.io/answers/what-is-promiseall-in-javascript" rel="noopener noreferrer"&gt;What is Promise.all() in JavaScript?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>promises</category>
      <category>api</category>
    </item>
    <item>
      <title>Entendendo Promises: Como funcionam e seus benefícios em JavaScript</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Thu, 06 Apr 2023 23:42:00 +0000</pubDate>
      <link>https://dev.to/ramonborges15/entendendo-promises-como-funcionam-e-seus-beneficios-em-javascript-5eaa</link>
      <guid>https://dev.to/ramonborges15/entendendo-promises-como-funcionam-e-seus-beneficios-em-javascript-5eaa</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Esse é o nosso penúltimo artigo da série Ecmascript 6. Iremos tratar sobre &lt;code&gt;promises&lt;/code&gt;. Esse tema será dividido em duas partes. Nessa primeira, iremos falar sobre conceitos importantes e benefícios. A ideia é compartilhar algumas anotações minhas durante a leitura do livro EcmaScript 6 Succinctly, que me permitiram compreender um pouquinho sobre &lt;code&gt;promises&lt;/code&gt;.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Explicação sobre como as Promises funcionam
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Promises&lt;/code&gt; fornecem um padrão de implementação para lidar com programação assíncrona em Javascript sem a necessidade de usar &lt;code&gt;callbacks&lt;/code&gt;. Uma &lt;code&gt;promise&lt;/code&gt; representa um valor que nós podemos lidar em algum momento no futuro.&lt;/p&gt;

&lt;p&gt;Para ficar mais claro, imagine que você é uma criança que pediu ao seu pai uma bola de presente. Ele lhe diz que irá te dar uma bola, mas não pode te entregar imediatamente, pois precisa comprá-la na loja. Ele então promete que trará a bola para você assim que puder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmIyZTJjM2Y5OWVlMDQzZThhZGE0ZDJhYjA0NGVhNTE4MDI4MmI3ZCZjdD1n/Cu7tfLe1edy3HE7JfC/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExMmIyZTJjM2Y5OWVlMDQzZThhZGE0ZDJhYjA0NGVhNTE4MDI4MmI3ZCZjdD1n/Cu7tfLe1edy3HE7JfC/giphy.gif" width="480" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo, a &lt;code&gt;promise&lt;/code&gt; é a promessa do pai de trazer a bola, que representa um valor (a bola) que você poderá lidar em algum momento no futuro (quando ele trouxer a bola para você).&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefícios do uso de Promises em relação a outros métodos assíncronos
&lt;/h3&gt;

&lt;p&gt;As &lt;code&gt;promises&lt;/code&gt; oferecem benefícios significativos em relação aos &lt;code&gt;callbacks&lt;/code&gt;, por exemplo. Uma das principais vantagens é que o contrato da &lt;code&gt;promise&lt;/code&gt; é imutável, ou seja, nenhum outro handler registrado pode alterar o valor.&lt;/p&gt;

&lt;p&gt;Aqui está um exemplo de código JavaScript que ilustra como uma &lt;code&gt;promise&lt;/code&gt; pode ser usada para garantir que o valor seja recebido independentemente de quando um handler for registrado para ele:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;promise&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="c1"&gt;// simula um valor que será retornado após 1 segundo&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;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;valor retornado&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// registra um handler para a Promise após 2 segundos&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;promise&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;valor&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="s2"&gt;`Valor recebido: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// registra outro handler para a Promise imediatamente&lt;/span&gt;
&lt;span class="nx"&gt;promise&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;valor&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="s2"&gt;`Outro valor recebido: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;Neste exemplo, uma &lt;code&gt;promise&lt;/code&gt; é criada com uma função que retorna um valor após 1 segundo. Em seguida, dois handlers são registrados para a &lt;code&gt;promise&lt;/code&gt;, um imediatamente e outro após 2 segundos. No entanto, como o contrato da &lt;code&gt;promise&lt;/code&gt; é imutável, o valor retornado nunca será alterado e, portanto, ambos os handlers receberão o mesmo valor.&lt;/p&gt;

&lt;p&gt;Além disso, com as &lt;code&gt;promises&lt;/code&gt;, temos a garantia de receber o valor, independentemente de quando nos registrarmos para recebê-lo, mesmo que já esteja resolvido. Isso contrasta com os &lt;code&gt;eventos&lt;/code&gt;, uma vez que, quando um evento é acionado, não é possível acessar o seu valor em um momento posterior.&lt;/p&gt;

&lt;h3&gt;
  
  
  E quando uma promessa não é cumprida?
&lt;/h3&gt;

&lt;p&gt;Até agora, nós só resolvemos &lt;code&gt;promises&lt;/code&gt;. Mas e quando rejeitamos uma? A rejeição de uma &lt;code&gt;promise&lt;/code&gt; ocorre quando há algum problema para cumprir a promessa, como falha na conexão com um servidor ou algum erro no código.&lt;/p&gt;

&lt;p&gt;Voltemos ao exemplo do pai e filho. Imagine que você é uma criança que pediu ao seu pai para ir ao parque de diversões. Ele concorda em levá-lo, mas diz que só poderá fazê-lo se não chover. No entanto, o tempo vira e começa a chover, o que significa que seu pai não pode cumprir sua promessa de levá-lo ao parque. Seu pai, então, rejeita sua promessa e explica que ele não pode cumprir o que havia prometido, pois as condições climáticas mudaram.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/gRnSZSRzOJeG4/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/gRnSZSRzOJeG4/giphy.gif" width="498" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo, a &lt;code&gt;promise&lt;/code&gt; é a promessa do pai de levá-lo ao parque, e o &lt;code&gt;reject&lt;/code&gt; é a decisão de não cumprir a promessa devido a uma condição não satisfeita (o mau tempo). No contexto do código, você pode tratar essa situação, usando o método &lt;code&gt;catch()&lt;/code&gt; na &lt;code&gt;promise&lt;/code&gt;, que permite capturar o erro e tratar a rejeição.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;promise&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;const&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;10&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;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;abc&lt;/span&gt;&lt;span class="dl"&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="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&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="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;b&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;Os valores precisam ser números!&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="nx"&gt;promise&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="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;error&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="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;No geral, o uso de &lt;code&gt;promises&lt;/code&gt; é uma forma eficiente e moderna de lidar com operações assíncronas em JavaScript. Comparado aos &lt;code&gt;callbacks&lt;/code&gt;, as &lt;code&gt;promises&lt;/code&gt; oferecem uma série de benefícios, como a imutabilidade do contrato da &lt;code&gt;promise&lt;/code&gt; e a garantia de que receberemos o valor, mesmo se já tiver sido resolvido. &lt;/p&gt;

&lt;p&gt;Além disso, aprendemos que uma promessa pode ser rejeitada, quando alguma condição básica não é atendida. Uma boa prática é utilizar o método catch a fim de tratar o erro (aprenderemos mais sobre tratamento de erros no próximo artigo). &lt;/p&gt;

&lt;p&gt;Você já usou &lt;code&gt;promises&lt;/code&gt; no seu código? Quando escrevia um código, tinha consciência do que estava fazendo? Deixa eu saber nos comentários, até a próxima!&lt;/p&gt;

&lt;h2&gt;
  
  
  Para saber mais acesse:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/succinctly-free-ebooks/ecmascript-6-succinctly" rel="noopener noreferrer"&gt;ECMAScript 6 Succinctly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>promises</category>
      <category>ecmascript</category>
      <category>programming</category>
    </item>
    <item>
      <title>Melhorando a manutenibilidade e escalabilidade do código com Módulos ES6</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Wed, 22 Mar 2023 13:00:00 +0000</pubDate>
      <link>https://dev.to/ramonborges15/melhorando-a-manutenibilidade-e-escalabilidade-do-codigo-com-modulos-es6-5eda</link>
      <guid>https://dev.to/ramonborges15/melhorando-a-manutenibilidade-e-escalabilidade-do-codigo-com-modulos-es6-5eda</guid>
      <description>&lt;p&gt;Continuando nossa série de artigos sobre ES6 (leia o último &lt;a href="https://dev.to/ramonborges15/ecmascript-6-uma-introducao-35fb"&gt;aqui&lt;/a&gt;), vamos falar hoje sobre módulos. O uso de módulos é uma das funcionalidades mais importantes introduzidas no EcmaScript 6. &lt;/p&gt;

&lt;p&gt;Ele permite que você organize seu código em pequenos pedaços independentes, tornando ele mais modular e fácil de manter. Módulos fornecem suporte para exportar e importar valores sem poluir o namespace global. &lt;/p&gt;

&lt;p&gt;Nós já tínhamos essa capacidade no JavaScript através de bibliotecas de terceiros como AMD e CommonJS, mas o ECMAScript 6, quando lançado, também trouxe essa habilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desenvolvimento
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;recurso de exportação&lt;/strong&gt; de módulos ES6 permite que você &lt;strong&gt;separe as preocupações&lt;/strong&gt; em módulos diferentes, tornando o código mais modular. Por exemplo, você pode criar um módulo que contenha apenas funções de validação, outro que contenha funções para manipulação de dados e assim por diante.&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;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateCPF&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cpf&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// code here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validateEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// code here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;transformToUTC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// code here&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como os módulos são independentes, eles podem ser reutilizados em diferentes partes do projeto, o que beneficia a escalabilidade.&lt;/p&gt;

&lt;p&gt;O recurso de exportação padrão &lt;strong&gt;(default)&lt;/strong&gt; permite que você exporte um único valor ou objeto de um módulo, tornando mais simples a sua importação em outros lugares do 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="c1"&gt;// tools.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;option&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;option&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="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&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;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;y&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;calculator&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./tools.js&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Result: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&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="c1"&gt;// Result: 4&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Ao utilizar o &lt;strong&gt;recurso de importação&lt;/strong&gt; de módulos ES6, você pode usar o chamado &lt;strong&gt;wildcards&lt;/strong&gt;. Ele permite que você importe um módulo inteiro e acesse todos os recursos por meio de uma notação &lt;em&gt;* as algum-nome&lt;/em&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="c1"&gt;// basic-operations.js&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;y&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;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;pi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;3.1415&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;calc&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./basic-operations.js&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Result: &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;calc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Result: 3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Em resumo, os módulos ES6 são uma funcionalidade poderosa do JavaScript que podem melhorar significativamente a manutenibilidade e escalabilidade do código. Eles permitem uma melhor organização do código, simplificam o gerenciamento de dependências e permitem a reutilização do código em diferentes projetos e contextos. Com o uso correto dos recursos de exportação, importação, exportação padrão e wildcards, é possível criar um código mais modular, legível e fácil de manter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Para mais informações
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hacks.mozilla.org/2018/03/es-modules-a-cartoon-deep-dive/" rel="noopener noreferrer"&gt;ES modules: A cartoon deep-dive
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/succinctly-free-ebooks/ecmascript-6-succinctly" rel="noopener noreferrer"&gt;ECMAScript 6 Succinctly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>es6module</category>
      <category>javascript</category>
      <category>modularidade</category>
      <category>manutenibilidade</category>
    </item>
    <item>
      <title>Ecmascript 6: Uma introdução</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Wed, 08 Mar 2023 13:00:00 +0000</pubDate>
      <link>https://dev.to/ramonborges15/ecmascript-6-uma-introducao-35fb</link>
      <guid>https://dev.to/ramonborges15/ecmascript-6-uma-introducao-35fb</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;p&gt;Hoje, iniciaremos um pequeno mergulho dentro do Ecmascript 6. A ideia de criar essa série, veio depois de iniciar a leitura do e-book ECMAScript 6 Succinctly - By Matthew Duffield. Entendi que seria uma boa compartilhar minhas anotações e o que tenho aprendido sobre.&lt;/p&gt;

&lt;p&gt;Este artigo é o primeiro de uma série de 3, que irá percorrer os recursos do Ecmascript 6.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desenvolvimento
&lt;/h2&gt;

&lt;p&gt;O ES6 possui uma série de features interessantes (falaremos nos próximos posts). Porém, nesse primeiro, iremos focar em algumas perguntas e conceitos introdutórios.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é ES6?
&lt;/h3&gt;

&lt;p&gt;Ecmascript 6 (ES6) ou ECMAScript 2015 é a 6º edição do padrão de especificação da linguagem ECMAScript. Ela define quais são os padrões para a implementação de JavaScript (se você já utilizou o ecossistema Java, deve estar familiarizado com os conceitos de especificação e implementação).&lt;/p&gt;

&lt;h3&gt;
  
  
  Qual a diferença entre JavaScript e ES6?
&lt;/h3&gt;

&lt;p&gt;Provavelmente, já deve ter ficado claro no parágrafo anterior. Mas para destacar, em poucas palavras, podemos dizer que ECMAScript é uma especificação de linguagem, ou seja, ela define os padrões para uma linguagem de programação, e o JavaScript é a implementação desses padrões.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transpilação e ES6
&lt;/h3&gt;

&lt;p&gt;Nem todos os navegadores suportam todas as features do ES6. Portanto, é necessário que o seu código ES6 seja transpilado para uma versão compatível com todos os navegadores. Transpilar significa simplesmente converter seu código ES6 para ES5, dessa forma ele poderá ser lido por todos os navegadores. O transpilador mais popular para ES6 é o &lt;a href="https://babeljs.io/" rel="noopener noreferrer"&gt;Babel&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Neste artigo, nós aprendemos sobre o ECMAScript 2015 ou ES6, que é responsável por definir os padrões para implementação JavaScript. Nós também percebemos a diferença entre JavasScript e ES6. Por fim, aprendemos sobre o funcionamento do transpilador e sua utilidade para o ES6.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado. Qualquer dúvida, sugestão ou correção, estou a disposição. Nos vemos no próximo post!&lt;/p&gt;

&lt;h2&gt;
  
  
  Fontes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.syncfusion.com/succinctly-free-ebooks/ecmascript-6-succinctly" rel="noopener noreferrer"&gt;ECMAScript 6 Succinctly - Matthew Duffield&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ecmascript6</category>
      <category>javascript</category>
      <category>es6</category>
      <category>webdev</category>
    </item>
    <item>
      <title>3 estratégias para organizar nosso código de maneira mais profissional</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Mon, 31 Jan 2022 23:40:08 +0000</pubDate>
      <link>https://dev.to/ramonborges15/3-estrategias-para-organizar-nosso-codigo-de-maneira-mais-profissional-15o</link>
      <guid>https://dev.to/ramonborges15/3-estrategias-para-organizar-nosso-codigo-de-maneira-mais-profissional-15o</guid>
      <description>&lt;p&gt;A nossa principal tarefa como desenvolvedor é resolver problemas. A nossa principal ferramenta para alcançar essa meta é o nosso código. &lt;/p&gt;

&lt;p&gt;Um código não profissional, tem o poder de nos atrasar consideravelmente, nos fazendo trabalhar mais lentamente. Além disso, nesse contexto de código ruim, qualquer alteração pode ser acompanhada de bugs. Isso é péssimo!&lt;/p&gt;

&lt;p&gt;Como podemos superar isso? Como organizar o nosso código de maneira mais profissional?&lt;/p&gt;

&lt;h3&gt;
  
  
  Os amigos inseparáveis
&lt;/h3&gt;

&lt;p&gt;Se em algum momento da vida teve contato com orientação a objetos, já deve ter ouvido falar sobre &lt;strong&gt;coesão&lt;/strong&gt; e &lt;strong&gt;acoplamento&lt;/strong&gt;. Estes são dois conceitos fundamentais neste paradigma. Idealmente, um bom código é composto de alta coesão e baixo acoplamento. Talvez, podemos dizer que uma das características de um código profissional esteja resumida nesta frase.&lt;/p&gt;

&lt;h3&gt;
  
  
  As 3 estratégias
&lt;/h3&gt;

&lt;p&gt;Gostaria de listar três estratégias que certamente nos ajudarão na caminhada de produzir códigos com alta coesão e baixo acoplamento (ou seja, código mais profissional).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nem tudo precisa estar público&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quanto mais aberto for cada um dos nossos contextos, mais a nossa base de código se tornará uma emaranhado de objetos. Certamente a manutenção desse código será mais difícil, já que existe uma ligação muito grande entre todo o código &lt;strong&gt;(alto acoplamento)&lt;/strong&gt;. Isso pode fazer com que a alteração em um ponto do sistema propague a necessidade de mudanças em outros. Nós precisamos resistir a tentação de deixar tudo público! Isso diminui as chances de criar dependências desnecessárias para as nossas classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cada um no seu quadrado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os pacotes devem conter todas as classes de um contexto específico. O código que serve a um propósito comum deve se manter unido. Isso mantém nosso código mais coeso. Baixa coesão significa que o código que compõem alguma funcionalidade pode estar espalhado por toda a base de código, em diversos contextos. Isso dificulta tanto a legibilidade como a manutenibilidade.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programando para interfaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como então um contexto pode conversar com outro sem deixar todas as classes públicas? Uma das maneiras de resolver esse problema é permitir que os contextos se comuniquem através de interfaces e que na medida do possível, apenas elas sejam publicas. Ela será a porta de entrada do seu contexto.&lt;/p&gt;

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

&lt;p&gt;Este foi um primeiro passo para o desenvolvimento de um código mais profissional. Certamente a aplicação dessas estratégias, permitirá desenvolver um código melhor, mais fácil de manter e mais adaptável a novos requisitos. Espero que tenha gostado do conteúdo, até a próxima 🤙!&lt;/p&gt;

&lt;h4&gt;
  
  
  📃 Para saber mais
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dzone.com/articles/we-are-structuring-code-wrongly" rel="noopener noreferrer"&gt;https://dzone.com/articles/we-are-structuring-code-wrongly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/39946/coupling-and-cohesion/39988#39988" rel="noopener noreferrer"&gt;https://stackoverflow.com/questions/39946/coupling-and-cohesion/39988#39988&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://softwareengineering.stackexchange.com/questions/334591/why-not-make-everything-private-or-public" rel="noopener noreferrer"&gt;https://softwareengineering.stackexchange.com/questions/334591/why-not-make-everything-private-or-public&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursos.alura.com.br/forum/topico-sobre-programar-para-interfaces-18358" rel="noopener noreferrer"&gt;https://cursos.alura.com.br/forum/topico-sobre-programar-para-interfaces-18358&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.matheuscastiglioni.com.br/medindo-e-entendendo-acoplamento/#:%7E:text=Acoplamento%20Aferente%3A%20Mede%20o%20n%C3%BAmero,conex%C3%B5es%20que%20sai%20dos%20c%C3%B3digos" rel="noopener noreferrer"&gt;https://blog.matheuscastiglioni.com.br/medindo-e-entendendo-acoplamento/#:~:text=Acoplamento%20Aferente%3A%20Mede%20o%20n%C3%BAmero,conex%C3%B5es%20que%20sai%20dos%20c%C3%B3digos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/clarityhub/low-coupling-high-cohesion-3610e35ac4a6" rel="noopener noreferrer"&gt;https://medium.com/clarityhub/low-coupling-high-cohesion-3610e35ac4a6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Créditos foto: &lt;em&gt;&lt;a href="https://br.freepik.com/fotos-vetores-gratis/fundo" rel="noopener noreferrer"&gt;Fundo foto criado por evening_tao - br.freepik.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>orientacaoobjetos</category>
      <category>designcodigo</category>
      <category>backend</category>
      <category>codigolimpo</category>
    </item>
    <item>
      <title>Minha experiência no hacktoberfest 2020</title>
      <dc:creator>Ramon Borges</dc:creator>
      <pubDate>Tue, 17 Nov 2020 21:32:07 +0000</pubDate>
      <link>https://dev.to/ramonborges15/minha-experiencia-no-hacktoberfest-2020-13c7</link>
      <guid>https://dev.to/ramonborges15/minha-experiencia-no-hacktoberfest-2020-13c7</guid>
      <description>&lt;p&gt;Achei interessante compartilhar um pouco das minhas experiências durante a participação no hacktoberfest. Este post além de ser um registro histórico, onde poderei reviver as experiência que vivi, também tem o intuito de incentivar você a participar de eventos como esse. Bom, gostaria de iniciar falando um pouco sobre o que é o Hacktoberfest.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o Hacktoberfest?
&lt;/h3&gt;

&lt;p&gt;É um evento que dura todo o mês de outubro e tem o objetivo de &lt;strong&gt;celebrar a contribuição em projetos open-source&lt;/strong&gt;. Este evento é aberto a todas as pessoas ao redor do mundo. Ele é organizado pela DigitalOcean (uma provedora americana de infraestrutura em nuvem).&lt;/p&gt;

&lt;h3&gt;
  
  
  Como funciona?
&lt;/h3&gt;

&lt;p&gt;O primeiro passo é se inscrever no site do HacktoberFest. Pronto! A partir daí você está apto para iniciar a sua jornada em busca de no mínimo 4 pull requests em qualquer repositório do github classificado com o tópico HacktoberFest. Esses pull requests devem ser feitos durante o mês de outubro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Encontrando repositórios para contribuir
&lt;/h3&gt;

&lt;p&gt;A minha busca começou no dia 1 de outubro. Procurei alguns repositórios, mas sem sucesso. Uma semana depois, iniciei novamente a procura. Busquei por repositórios com o tópico hacktoberFest. &lt;/p&gt;

&lt;p&gt;A partir daí, veriquei aqueles que estavam com alguma issue aberta, mas ainda sem alguém responsável pelo desenvolvimento. Inseri alguns filtros de acordo com as linguagens que tinha interesse (agrupei os repositórios filtrados neste &lt;a href="https://github.com/search?q=label%3Ahacktoberfest+state%3Aopen+no%3Aassignee+is%3Aissue&amp;amp;type=Issues" rel="noopener noreferrer"&gt;link&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Depois de uma ligeira procura descobri o meu primeiro repositório: &lt;strong&gt;codeezzi/utility&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Minhas contribuições
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/codeezzi/utility" rel="noopener noreferrer"&gt;codeezzi/utility&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Utility foi criado para ser um site de conversão de unidades simples e fácil de usar, além de várias ferramentas utilitárias. Ele é um site estático feito totalmente com HTML, CSS e JS.&lt;/p&gt;

&lt;p&gt;Resolvi duas issues nesse repositório:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar um conversor de velocidades.&lt;/li&gt;
&lt;li&gt;Criar um gerador de séries matemáticas.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Este &lt;a href="http://codeezzi-utility.surge.sh/" rel="noopener noreferrer"&gt;link&lt;/a&gt; dá acesso ao site estático.&lt;/p&gt;

&lt;p&gt;Depois de realizar essas duas contribuições, encontrei um outro repositório chamado &lt;strong&gt;fengyuanyang/JavaTDD&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://github.com/fengyuanyang/JavaTDD" rel="noopener noreferrer"&gt;fengyuanyang/JavaTDD&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;JavaTDD é um repositório criado para incentivar os programadores a construírem código utilizando &lt;strong&gt;Test Driven Developer&lt;/strong&gt;. Resolvi duas issues nesse repositório. &lt;/p&gt;

&lt;p&gt;Finalmente, no dia 26 de outubro consegui o desejado 4º pull request!🎉 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fooyh3v5zix1bggdn52d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fooyh3v5zix1bggdn52d3.png" alt="Alt Text" width="800" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Pontos positivos
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Contato com inglês
&lt;/h4&gt;

&lt;p&gt;Todos nós que trabalhamos na área de tecnologia sabemos da importância do Inglês. No hacktoberfest, toda comunicação que realizei, seja para solicitar ao dono do projeto uma issue, escrever a mensagem dos commits e dos pull requests, ler as diretrizes de cada projeto eram feitas em inglês. Isso foi uma boa oportunidade de treinar o meu inglês.&lt;/p&gt;

&lt;h4&gt;
  
  
  Github
&lt;/h4&gt;

&lt;p&gt;Já uso git há um tempão, mas não tinha muita segurança com o comando fork, pois geralmente nos projetos que trabalho nunca preciso usar. Durante esse mês de outubro foi possível exercitar mais esse processo de "forkear" um repositório.&lt;/p&gt;

&lt;h4&gt;
  
  
  Contato com outros programadores
&lt;/h4&gt;

&lt;p&gt;Olha que interessante, o dono do repositório JavaTDD é de Taiwan e do repositório Utility é da Índia. Tive oportunidade de estar em contato com programadores de outras partes do mundo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Desenvolvimento de habilidades fora do ambiente de trabalho
&lt;/h4&gt;

&lt;p&gt;Durante um bom tempo da minha carreira, o meu aprendizado e a melhoria de minhas habilidades em programação vinham apenas dos problemas que enfretava no meu dia a dia de trabalho. &lt;/p&gt;

&lt;p&gt;Durante esse hacktoberfest, por exemplo, tive a oportunidade de desenvolver algumas atividades utilizando JS, uma linguagem que não tenho tanto contato no meu dia a dia. No outro repositório, foi possível aplicar TDD, algo também que ainda não tinha aplicado no meu trabalho.&lt;/p&gt;

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

&lt;p&gt;O Hacktoberfest 2020 chegou ao fim. Certamente foram 30 dias bem desafiadores. Cada pull request enviado e aceito gerava um sentimento de felicidade! A oportunidade de contribuir em repositórios e perceber que as suas contribuições foram úteis para alguém do outro lado do mundo, é muito bom. &lt;/p&gt;

&lt;p&gt;Sem dúvida esse é um dos motivos que mais me fazem querer participar novamente. Já estou contando as horas para a próxima edição. Espero que você também esteja lá 😉. Até mais!!! &lt;/p&gt;

</description>
      <category>hacktoberfest</category>
      <category>codigoaberto</category>
    </item>
  </channel>
</rss>
