<?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: Carlos José Vaz</title>
    <description>The latest articles on DEV Community by Carlos José Vaz (@cjvaz).</description>
    <link>https://dev.to/cjvaz</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%2F154330%2F48175fe8-e6ef-4d6b-abd1-bc0520a91bab.jpeg</url>
      <title>DEV Community: Carlos José Vaz</title>
      <link>https://dev.to/cjvaz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cjvaz"/>
    <language>en</language>
    <item>
      <title>Javascript Assíncrono - Fluxo assíncrono e Event Loop</title>
      <dc:creator>Carlos José Vaz</dc:creator>
      <pubDate>Sun, 01 May 2022 23:47:04 +0000</pubDate>
      <link>https://dev.to/cjvaz/javascript-assincrono-fluxo-assincrono-e-event-loop-1jp6</link>
      <guid>https://dev.to/cjvaz/javascript-assincrono-fluxo-assincrono-e-event-loop-1jp6</guid>
      <description>&lt;p&gt;No &lt;a href="https://carlosvaz.com.br/javascript-assincrono-entenda-o-que-sao-callbacks"&gt;artigo anterior&lt;/a&gt; aprendemos o que são callbacks e como funcionam, esse conhecimento é importante para termos o entendimento suficiente para compreender o conteúdo desse artigo e os demais da série.&lt;br&gt;
Aqui, iremos entender sobre o fluxo assíncrono do Javascript.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fluxo síncrono
&lt;/h2&gt;

&lt;p&gt;Antes disso vamos recapitular novamente o que é fluxo síncrono. Segue abaixo um exemplo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 console.log('Início do cálculo');
2 const resultado = 2 + 2;
3 console.log('Resultado é igual a:', resultado);
4 console.log('Fim do cálculo');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O resultado que aparecerá na tela (ou console) será:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Início do cálculo
Resultado é igual a: 4
Fim do cálculo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como era de se esperar, o código foi executado linha por linha, da 1 até a linha 4, nessa sequência, de modo síncrono.&lt;/p&gt;

&lt;p&gt;Por enquanto não há nenhum mistério por aqui, certo?&lt;/p&gt;

&lt;p&gt;Javascript é &lt;strong&gt;&lt;em&gt;single threaded&lt;/em&gt;&lt;/strong&gt;, ou seja, opera em uma única thread, se você executar com código síncrono e por alguma eventualidade um comando bloquear a thread principal, o seu navegador (ou script no caso do node) irá travar até que a operação seja concluída.&lt;/p&gt;

&lt;p&gt;Abaixo segue um bom exemplo adicionando o comando &lt;code&gt;alert()&lt;/code&gt; no código anterior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 console.log('Início do cálculo');
2 const resultado = 2 + 2;
3 alert('Clique para continuar');
3 console.log('Resultado é igual a:', resultado);
4 console.log('Fim do cálculo');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se executarmos esse código no navegador, a linha 1, 2 e 3 serão executadas. A terceira linha irá lançar um alerta na tela, isso irá bloquear o navegador, não permitindo nenhuma outra interação do usuário, ao menos que ele pressione o botão &lt;code&gt;Ok&lt;/code&gt; do alerta. Após o clique no botão &lt;code&gt;Ok&lt;/code&gt; as linhas 3 e 4 serão executadas.&lt;/p&gt;

&lt;p&gt;Qual é o problema desse tipo de execução? imagina uma aplicação web como facebook, home banking, webmail ou youtube, se todo comando de pesquisa, ação de abrir um email ou execução de um vídeo bloqueasse a tela?&lt;/p&gt;

&lt;p&gt;Essa maneira síncrona de execução é ruim porque não sabemos quanto tempo um vídeo será carregado, uma imagem será baixada ou uma resposta de um serviço será retornada, e pior, se ocorrerá um erro ou não.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fluxo assíncrono
&lt;/h2&gt;

&lt;p&gt;O que é assíncrono? de acordo com o dicionários na web:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Assíncrono: Que não ocorre ou não se efetiva ao mesmo tempo, que não acontece juntamente com outra coisa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No YouTube, por exemplo, quando um vídeo está sendo carregado ou executado, essa operação é assíncrona, ela não bloqueia a tela do navegador, você pode realizar outra interação na tela do aplicativo web ao mesmo tempo que outras operações estão ocorrendo de forma assíncrona.&lt;/p&gt;

&lt;p&gt;Mas como é possível execuções paralelas visto que o Javascript é &lt;em&gt;single thread&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;Agora vamos entrar em uma parte bem interessante, entender como o fluxo assíncrono funciona e assim responder a essa pergunta.&lt;/p&gt;

&lt;h3&gt;
  
  
  Call Stack
&lt;/h3&gt;

&lt;p&gt;É o mecanismo do interpretador do Javascript, ele adiciona as funções para serem executa uma por vez, assim que forem executados ele remove da pilha.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Aqui nesse artigo vamos utilizar o &lt;a href="http://latentflip.com/loupe"&gt;loupe&lt;/a&gt; para simular como funciona o runtime do Javascript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Abaixo um exemplo de sequência de execução de linhas contendo comandos &lt;em&gt;console.log&lt;/em&gt;, você verá cada linha sendo executada e logo após removida do Call Stack.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p2UnzT33--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oqc9da3jfbdhkcw6k8wx.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p2UnzT33--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oqc9da3jfbdhkcw6k8wx.gif" alt="Exemplo de código síncrono sendo executado loupe" width="840" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://latentflip.com/loupe/?code=Cgpjb25zb2xlLmxvZygnMScpOwpjb25zb2xlLmxvZygnMicpOwpjb25zb2xlLmxvZygnMycpOwpjb25zb2xlLmxvZygnNCcpOwo%3D!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D"&gt;Código da imagem acima no loupe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como falamos anteriormente, o Javascript é  &lt;strong&gt;&lt;em&gt;single threaded&lt;/em&gt;&lt;/strong&gt;, podemos ver isso na &lt;strong&gt;&lt;em&gt;Call Stack&lt;/em&gt;&lt;/strong&gt;, código mal implementado pode bloquea-la facilmente. Abaixo podemos ver um comando &lt;em&gt;while&lt;/em&gt; sendo executado infinitamente, o que acaba ocasionando o bloqueio da &lt;em&gt;Call Stack&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TAt1MwxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jk3261vffqxlveodzfpv.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TAt1MwxJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jk3261vffqxlveodzfpv.gif" alt="Exemplo de bloqueio da call stack ocasionado por um loop infinito" width="840" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://latentflip.com/loupe/?code=Cgpjb25zb2xlLmxvZygnMScpOwpjb25zb2xlLmxvZygnMicpOwpjb25zb2xlLmxvZygnMycpOwp3aGlsZSh0cnVlKSB7CiAgY29uc29sZS5sb2coJ0VudHJvdSBubyB3aGlsZSBpbmZpbml0bycpOwp9Cgpjb25zb2xlLmxvZygnNCcpOw%3D%3D!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D"&gt;Código da imagem acima no loupe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora um novo exemplo de funções sendo adicionadas na &lt;em&gt;Call Stack&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aEP_5aNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vkkgy3lkyk5hd9fwhb2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aEP_5aNl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vkkgy3lkyk5hd9fwhb2.gif" alt="Empilhamento de funções na call stack" width="840" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://latentflip.com/loupe/?code=CgpmdW5jdGlvbiBmbjMoKSB7CiAgY29uc29sZS5sb2coJ0ZuMycpOwp9CgpmdW5jdGlvbiBmbjIoKSB7CiAgZm4zKCk7Cn0KCmZ1bmN0aW9uIGZuMSgpIHsKICBmbjIoKTsKfQoKZnVuY3Rpb24gbWFpbigpIHsKICBmbjEoKTsKfQoKbWFpbigpOwo%3D!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D"&gt;Código da imagem acima no loupe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que entendemos com funciona a &lt;em&gt;Call Stack&lt;/em&gt; vamos aprofundar o entendimento da parte assíncrona do Javascript, com explicações sobre &lt;strong&gt;&lt;em&gt;Web APIs&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Callback Queue&lt;/em&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;em&gt;Event Loop&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Web APIs
&lt;/h3&gt;

&lt;p&gt;Os navegadores fornecem Api's com funções assíncronas que podemos utilizar no nosso código, elas são executadas separadamente da Call Stack, evitando o seu bloqueio e realizando a execução em paralelo ao restando dos códigos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Callback Queue
&lt;/h3&gt;

&lt;p&gt;Quando utilizamos uma função assíncrona da Api do javascript, normalmente queremos reagir ao resultado dessa função, como por exemplo dados recebidos de uma chamada externa ou conteúdo de algum arquivo lido do disco local. Nesse momento entra a principal função dos &lt;strong&gt;&lt;em&gt;callbacks&lt;/em&gt;&lt;/strong&gt;, eles serão chamados quando função principal terminar sua execução e repassando para eles os seus resultados.&lt;br&gt;
Após isso os callbacks serão colocados na &lt;strong&gt;&lt;em&gt;Callback queue&lt;/em&gt;&lt;/strong&gt;, e aguardar até que a &lt;strong&gt;&lt;em&gt;Call Stack&lt;/em&gt;&lt;/strong&gt; esteja vazia para serem executados.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Loop
&lt;/h3&gt;

&lt;p&gt;O &lt;strong&gt;&lt;em&gt;Event Loop&lt;/em&gt;&lt;/strong&gt; irá pegar o primeiro callback da &lt;strong&gt;&lt;em&gt;Callback Queue&lt;/em&gt;&lt;/strong&gt; e adicionar na &lt;strong&gt;&lt;em&gt;Call Stack&lt;/em&gt;&lt;/strong&gt; assim que a mesma estiver vazia. Se na Call Stack contiver algum código o Event Loop será bloqueado e não adicionará nenhum chamada até que a pilha esteja vazia.&lt;/p&gt;

&lt;p&gt;Abaixo segue um exemplo utilizando &lt;strong&gt;&lt;em&gt;setTimeout&lt;/em&gt;&lt;/strong&gt; do Javascript, ele é uma função assíncrona que recebe um callback como parâmetro.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AVCzsnpp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xpjucxxqkytgcy2j25zm.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AVCzsnpp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xpjucxxqkytgcy2j25zm.gif" alt="event_loop_04_callback_queue.gif" width="840" height="471"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="http://latentflip.com/loupe/?code=CgpmdW5jdGlvbiBidXNjYURhZG9zKCkgewogIHNldFRpbWVvdXQoZnVuY3Rpb24gc2ltdWxhQ29uc3VsdGFBcGkoKSB7CiAgICBjb25zb2xlLmxvZygnRGFkb3MgcmV0b3JuYWRvcycpOwogIH0sIDMwMDApOwp9CgpmdW5jdGlvbiBmdW5jYW8wMSgpIHsKICBidXNjYURhZG9zKCk7CiAgY29uc29sZS5sb2coJ2Z1bmNhbzAxJyk7Cn0KCmZ1bmN0aW9uIG1haW4oKSB7CiAgY29uc29sZS5sb2coJ0luaWNpYW5kby4uLicpOwogIGZ1bmNhbzAxKCk7Cn0KCm1haW4oKTsKY29uc29sZS5sb2coJ0ZpbSEnKTsK!!!PGJ1dHRvbj5DbGljayBtZSE8L2J1dHRvbj4%3D"&gt;Código da imagem acima no loupe&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos entender passo a passo do exemplo acima:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na linha &lt;code&gt;19&lt;/code&gt; a função &lt;code&gt;main()&lt;/code&gt; é chamada e colocada na &lt;em&gt;Call Stack&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;Ao executar a função &lt;code&gt;main()&lt;/code&gt; o javascript lê o comando &lt;code&gt;console.log('Iniciando...')&lt;/code&gt; da linha &lt;code&gt;15&lt;/code&gt;, coloca na &lt;code&gt;Call Stack&lt;/code&gt; e o executa, logo após o comando é removido da pilha;&lt;/li&gt;
&lt;li&gt;Na linha &lt;code&gt;16&lt;/code&gt; a função &lt;code&gt;funcao01()&lt;/code&gt; é chamada e colocada na &lt;code&gt;Call Stack&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Ao executar a função &lt;code&gt;funcao01()&lt;/code&gt;, encontramos na linha &lt;code&gt;10&lt;/code&gt; a chamada para a função &lt;code&gt;buscaDados()&lt;/code&gt;, a mesma é colocada na &lt;code&gt;Call Stack&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Ao ler a função &lt;code&gt;buscaDados()&lt;/code&gt;, o javascript encontra na linha &lt;code&gt;4&lt;/code&gt; o comando &lt;code&gt;setTimeout&lt;/code&gt;, como ele é uma função assíncrona o javascript o coloca na fila &lt;code&gt;Web Apis&lt;/code&gt; para ser executado, aguardará 3 segundos e após isso seu callback &lt;code&gt;simulaConsultaApi()&lt;/code&gt; é movido para a &lt;code&gt;Callback Queue&lt;/code&gt;, para aguardar seu momento para entrar na &lt;code&gt;Call Stack&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Nesse momento temos na &lt;code&gt;Call Stack&lt;/code&gt;, do topo da fila para baixo, as seguintes funções: &lt;code&gt;buscaDados&lt;/code&gt;, &lt;code&gt;funcao01&lt;/code&gt; e &lt;code&gt;main&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Continuando no fluxo da &lt;code&gt;Call Stack&lt;/code&gt;, a função &lt;code&gt;buscaDados&lt;/code&gt; é removida da fila;&lt;/li&gt;
&lt;li&gt;O fluxo continua na linha &lt;code&gt;11&lt;/code&gt;, onde o comando &lt;code&gt;console.log('funcao01')&lt;/code&gt;, é colocado na &lt;code&gt;Call Stack&lt;/code&gt;, e após a sua execução ele é removido da pilha;&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;funcao01()&lt;/code&gt; é removida da &lt;code&gt;Call Stack&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;A função &lt;code&gt;main()&lt;/code&gt; é removida da &lt;code&gt;Call Stack&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;O fluxo segue na linha &lt;code&gt;20&lt;/code&gt;, o comando &lt;code&gt;console.log('Fim!')&lt;/code&gt; é colocado na &lt;code&gt;Call Stack&lt;/code&gt; e executado, logo após é removido;&lt;/li&gt;
&lt;li&gt;Como a fila da &lt;code&gt;Call Stack&lt;/code&gt; está vazia, o &lt;code&gt;Event Loop&lt;/code&gt; irá pegar o &lt;code&gt;callback simulaConsultaApi()&lt;/code&gt; e coloca-la na &lt;code&gt;Call Stack&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;Ao executar o &lt;code&gt;callback simulaConsultaApi()&lt;/code&gt;, o comando &lt;code&gt;console.log('Dados retornados')&lt;/code&gt; da linha &lt;code&gt;5&lt;/code&gt; será posto na &lt;code&gt;Call Stack&lt;/code&gt;, executado e logo após removido.&lt;/li&gt;
&lt;li&gt;E para finalizar, o &lt;code&gt;callback simulaConsultaApi()&lt;/code&gt; será removido da &lt;code&gt;Call Stack&lt;/code&gt; e o programa será finalizado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Resumindo:&lt;br&gt;
O funcionamento em paralelo de funções no Javascript consiste em pegar funções assíncronas e coloca-las na Web Apis para serem executadas em paralelo a Call Stack. Ao finalizar sua execução ela pega o callback que lhe foi fornecido com o resultado e o coloca na Callback Queue, quando a Call Stack estiver vazia o Event Loop joga o callback na Call Stack para ser executado.&lt;/p&gt;

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

&lt;p&gt;Essa explicações foram bem superficiais mas muito importantes para entendermos o que ocorre "por baixo do capô" do Javascript.&lt;br&gt;
Nos próximos artigos da série iremos entrar em mais detalhes e entender sobre &lt;strong&gt;&lt;em&gt;Promises&lt;/em&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;em&gt;Async/Await&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Espero que tenham gostado! Se puderem, deixem seus comentários e feedbacks :)&lt;/p&gt;

&lt;p&gt;Originally posted on my blog &lt;a href="https://carlosvaz.com.br/javascript-assincrono-fluxo-assincrono-e-event-loop"&gt;carlosvaz.com.br&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=8aGhZQkoFbQ"&gt;https://www.youtube.com/watch?v=8aGhZQkoFbQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>callbacks</category>
      <category>promises</category>
      <category>programming</category>
    </item>
    <item>
      <title>Javascript Assíncrono - Entenda o que são Callbacks</title>
      <dc:creator>Carlos José Vaz</dc:creator>
      <pubDate>Tue, 26 Apr 2022 11:42:39 +0000</pubDate>
      <link>https://dev.to/cjvaz/javascript-assincrono-entenda-o-que-sao-callbacks-57d5</link>
      <guid>https://dev.to/cjvaz/javascript-assincrono-entenda-o-que-sao-callbacks-57d5</guid>
      <description>&lt;p&gt;Javascript é uma linguagem de programação leve, interpretada e com inúmeras aplicações, com ela podemos desenvolver desde páginas web até sistemas complexos. Ter o domínio e entendimento do seu funcionamento principal lhe trará diversas vantagens no desenvolvimento das suas soluções e também ter o conhecimento necessário para explorar diversas funcionalidades avançadas.&lt;br&gt;
Com base nisso criaremos uma série de artigos para explicar como funciona a parte assíncrona do Javascript, começando por esse primeiro artigo sobre Callbacks.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que são Callbacks?
&lt;/h2&gt;

&lt;p&gt;Se traduzirmos &lt;strong&gt;Callback&lt;/strong&gt; será algo como &lt;em&gt;chamada de retorno&lt;/em&gt;, o que soa um pouco complicado né? vamos tentar melhorar um pouco esse entendimento:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Callback é uma função que será executada quando algum evento ocorrer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ajudou? não muito?&lt;/p&gt;

&lt;p&gt;No Javascript, Callback é uma função passada como argumento para outra função, que será executada posteriormente, mais abaixo traremos exemplo no qual ficará mais fácil de entender seu uso.&lt;/p&gt;
&lt;h3&gt;
  
  
  Por que no Javascript Callback são tão importantes?
&lt;/h3&gt;

&lt;p&gt;O Javascript, e outras linguagens de programação, os códigos são executados de forma sequencial, mas haverá casos que essa execução não será dessa maneira, mas sim de forma assíncrona, ou seja, não esperar a finalização de um fluxo para executar o próximo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Exemplos
&lt;/h2&gt;

&lt;p&gt;Abaixo vamos verificar um exemplo de Callback.&lt;/p&gt;

&lt;p&gt;A função abaixo imprime no console o valor que ela recebe por parâmetro. Ela é simples, mas poderia ser uma função complexa para exibir um gráfico ou caracteres coloridos no console.&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="nx"&gt;imprimeNoConsoleOResultado&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="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`==&amp;gt; Resultado: &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; &amp;lt;===`&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;Essa outra função abaixo executa um calculo com os valores recebidos por parâmetro, o resultado desse calculo será repassado para o Callback, que é a função recebida no terceiro parâmetro da função &lt;code&gt;calcula&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="nx"&gt;calcula&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;exibirResultado&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;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;valor1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;valor2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;exibirResultado&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resultado&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;Como ficaria usando o Callback &lt;code&gt;imprimeNoConsoleOResultado&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="nx"&gt;calcula&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;imprimeNoConsoleOResultado&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 será exibido: &lt;code&gt;==&amp;gt; Resultado: 4 &amp;lt;===&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Digamos que queremos criar uma função de Callback de exibição mais complexa, que desenha um canvas com o resultado, segue 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="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;imprimeResultadoComCanvas&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;30px Arial&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;strokeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Resultado: &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="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&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 usando o callback &lt;code&gt;imprimeResultadoComCanvas&lt;/code&gt; que renderiza o resultado com canvas:&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;calcula&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;imprimeResultadoComCanvas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--76RkC0Zh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/446slhcn0r2u376r1uih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--76RkC0Zh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/446slhcn0r2u376r1uih.png" alt="Exibe a imagem 4 no canvas" width="396" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você poderá conferir o resultado por aqui: &lt;a href="https://jsfiddle.net/h5w2cn8f/19/"&gt;https://jsfiddle.net/h5w2cn8f/19/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com esses exemplos vimos que a função &lt;code&gt;calcula&lt;/code&gt; realiza o calculo e o resultado ela repassa para o Callback, que por sua vez manipula de acordo com a sua implementação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Objetos de Primeira Classe
&lt;/h2&gt;

&lt;p&gt;O Javascript tem recursos de programação funcional graças às suas funções serem de primeira classes, ou seja, todas funções do Javascript são tratadas como objetos, como valores, podemos guardá-las dentro de variáveis e elas também podem ser retornadas através de funções, isso abre um leque grande de utilização como por exemplo nos padrões de projeto como &lt;em&gt;High Order Functions&lt;/em&gt;.&lt;/p&gt;

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

&lt;p&gt;Callback é um recurso muito importante e muito utilizado no Javascript, esse entendimento nos ajudará no entendimento dos próximos artigos sobre processamento assíncrono.&lt;/p&gt;

&lt;p&gt;Originally posted on my blog &lt;a href="https://carlosvaz.com.br/javascript-assincrono-entenda-o-que-sao-callbacks"&gt;carlosvaz.com.br&lt;/a&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Glossary/Callback_function"&gt;https://developer.mozilla.org/pt-BR/docs/Glossary/Callback_function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.betrybe.com/tecnologia/callback/"&gt;https://blog.betrybe.com/tecnologia/callback/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/portuguese/news/funcoes-de-callback-em-javascript-o-que-sao-e-como-usa-las/"&gt;https://www.freecodecamp.org/portuguese/news/funcoes-de-callback-em-javascript-o-que-sao-e-como-usa-las/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>callbacks</category>
      <category>promises</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
