<?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: Monts</title>
    <description>The latest articles on DEV Community by Monts (@juliocesar1402).</description>
    <link>https://dev.to/juliocesar1402</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%2F705409%2F8fe85254-4643-4102-babb-1525e53b561f.png</url>
      <title>DEV Community: Monts</title>
      <link>https://dev.to/juliocesar1402</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juliocesar1402"/>
    <language>en</language>
    <item>
      <title>Promeses no JavaScript</title>
      <dc:creator>Monts</dc:creator>
      <pubDate>Mon, 27 Sep 2021 23:04:31 +0000</pubDate>
      <link>https://dev.to/juliocesar1402/promeses-no-javascript-3kj0</link>
      <guid>https://dev.to/juliocesar1402/promeses-no-javascript-3kj0</guid>
      <description>&lt;h2&gt;
  
  
  Fluxo Assíncrono
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;O JavaScript é uma linguagem &lt;code&gt;single-threade&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Consequências
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Deixa o usuário sem ação durante todo o tempo para a realização de uma operação;&lt;/li&gt;
&lt;li&gt;Não permite que o servidor seja capaz de realizar algum outra requisição até que a atual termine,,,,,,.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Solução
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Buscar em tornar operações muito extensas em operações assíncronas, dessa forma tornando o código mais performático e bem escrito.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Callbacks
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Assim que uma operação for concluída a callback será executada &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Exemplo:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
fs.readFile('./arquivo.txt', (err, content) =&amp;gt; {
  if (err) {
    console.error(`Erro ao ler o arquivo: ${err.message}`);
    return; 
  } 
  console.log(`Arquivo lido. Conteúdo: ${content.toString('utf8')}`);});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No código acima é utilizado uma &lt;code&gt;node-style callback&lt;/code&gt; (formato de callback nativa do Node.js)&lt;/p&gt;

&lt;h3&gt;
  
  
  O que está acontecendo:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;No primeiro parâmetro é passado o arquivo que sera lido;&lt;/li&gt;
&lt;li&gt;No segundo parâmetro é passado uma callback para tratar a resposta da função

&lt;ul&gt;
&lt;li&gt;Assim é possível tratar a resposta de forma diferente, dependendo de se ocorreu algum erro em meio ao processo ou se tudo ocorreu como deveria&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  O lado ruim das callback:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nem tudo são flores, o principal problema em se usar esse método é que seu resultado estará unicamente naquela callback, o que gera &lt;code&gt;a necessidade de executar uma coisa dentro da outra&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Exemplo:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  Callback hell
&lt;/h2&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
fs.readFile('file1.txt', (err, file1Content) =&amp;gt; {
  if (err) return console.log(Erro ao ler arquivo 1: ${err.message});
  console.log(Lido file1.txt com ${file1Content.byteLength} bytes);
  fs.readFile('file2.txt', (err, file2Content) =&amp;gt; {
    if (err) return console.log(Erro ao ler o arquivo 2: ${err.message});
    console.log(Lido file2.txt com ${file2Content.byteLength} bytes);
    fs.readFile('file3.txt', (err, file3Content) =&amp;gt; {
      if (err) return console.log(Erro ao ler o arquivo 3: ${err.message});
      console.log(Lido file3.txt com ${file3Content.byteLength} bytes);
    });
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como mostrado no código acima, a legibilidade se torna muito mais complexa devido a necessidade de criar uma callback dentro de outra callback até concluir sua tarefa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Possível solução:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
const file3Callback = (err, file3Content) =&amp;gt; {
  if (err) return console.log(Erro ao ler o arquivo 3: ${err.message});
  console.log(Lido file3.txt com ${file3Content.byteLength} bytes);
};
const file2Callback = (err, file2Content) =&amp;gt; {
  if (err) return console.log(Erro ao ler o arquivo 2: ${err.message});
  console.log(Lido file2.txt com ${file2Content.byteLength} bytes);
  fs.readFile('file3.txt', file3Callback);
};
const file1Callback = (err, file1Content) =&amp;gt; {
  if (err) return console.log(Erro ao ler arquivo 1: ${err.message});
  console.log(Lido file1.txt com ${file1Content.byteLength} bytes);
  fs.readFile('file2.txt', file2Callback);
};
fs.readFile('file1.txt', file1Callback);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como tentativa de tornar o código mais legível, são criadas varias funções com o único intuito de chamar a próxima callback, apesar de torná-lo um pouco mais legível, ainda não é performático.&lt;/p&gt;




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

&lt;blockquote&gt;
&lt;p&gt;A cereja do bolo para as callbacks, melhorando sua legibilidade e deixando seu código muito mais intuitivo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Sua principal diferença é que ao invés de uma única callback receber tanto o sucesso quanto o erro, ela tera duas callback com funções únicas, uma lidará com o erro e a outra com o sucesso. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ok, mas como essa mágica acontece?
&lt;/h3&gt;

&lt;p&gt;Observe os dois casos a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function dividirNumerosSemPromises(num1, num2) {
  if (num2 == 0) throw new Error("Não pode ser feito uma divisão por zero");

  return num1 / num2;
}

try {
  const resultado = dividirNumeros(2, 1);
  console.log(`resultado: ${resultado}`);
} catch (e) {
  console.log(e.message);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na função síncrona &lt;code&gt;dividirNumerosSemPromises&lt;/code&gt; o resultado da callback já é tratado dentro da função.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function dividirNumerosComPromises(num1, num2) {
  const promise = new Promise((resolve, reject) =&amp;gt; {
    if (num2 == 0) reject(new Error("Não pode ser feito uma divisão por zero"));
    const resultado = num1 / num2;
    resolve(resultado)
  });
  return promise;
}
dividirNumeros(2, 1)
  .then(result =&amp;gt; console.log(sucesso: ${result}))
  .catch(err =&amp;gt; console.log(erro: ${err.message}));
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora na função assíncrona &lt;code&gt;dividirNumerosComPromises&lt;/code&gt; o resultado não é tratado dentro da função, mas sim onde ela está sendo chamada. Assim, com uma mesma função é possível tratar a resposta em inúmeras formas diferentes&lt;/p&gt;

&lt;h3&gt;
  
  
  Then e resolve x Catch e reject
&lt;/h3&gt;

&lt;p&gt;Caso não tenha percebido, no segundo caso essas duas palavrinhas são utilizadas, mas o que elas significam?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then: forma de tratar o sucesso de uma callback, pode ser utilizado varias vezes no mesmo contexto;&lt;/li&gt;
&lt;li&gt;Catch: igualmente ao then, porém sua tarefa é tratar o erro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Estrutura da Promese:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const p = new Promise((resolve, reject) =&amp;gt; {
  // Aqui é onde vamos realizar a lógica que precisamos
  // para "tentar cumprir" a promessa
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao escrevê-la, não se esqueça de utilizar a palavra-chave &lt;code&gt;new&lt;/code&gt; e da arrow function como parâmetro da &lt;code&gt;Promese&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const fs = require('fs');
function readFilePromise (fileName) {
  return new Promise((resolve, reject) =&amp;gt; {

    fs.readFile(fileName, (err, content) =&amp;gt; {
      if (err) return reject(err);
      resolve(content);
    });

  });
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perceba, no exemplo acima estamos utilizando do modulo interno &lt;code&gt;fs&lt;/code&gt; apenas com o intuito de ilustrar, o importante aqui é perceber como o &lt;code&gt;resolve&lt;/code&gt; e o &lt;code&gt;reject&lt;/code&gt; são utilizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;readFilePromise('./file.txt') // A função me promete que vai ler o arquivo
  .then((content) =&amp;gt; { // Caso ela cumpra o que prometeu
    console.log(Lido arquivo com ${content.byteLength} bytes); // Escrevo o resultado no console
  })
  .catch((err) =&amp;gt; { // Caso ela não cumpra o que prometeu
    console.error(Erro ao ler arquivo: ${err.message}); // Escrevo o erro no console
  });
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sei que é muita coisa, mas aos pouquinhos você vai pegar o jeito :)&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>codequality</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
