{"id":49257,"date":"2024-05-23T12:00:00","date_gmt":"2024-05-23T15:00:00","guid":{"rendered":"https:\/\/www.locaweb.com.br\/blog\/?p=49257"},"modified":"2024-07-30T17:25:25","modified_gmt":"2024-07-30T20:25:25","slug":"javascript","status":"publish","type":"post","link":"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/javascript\/","title":{"rendered":"Async\/Await no JavaScript: como usar requisi\u00e7\u00f5es ass\u00edncronas e promessas?\u00a0"},"content":{"rendered":"\n<p class=\"has-text-align-center\"><em>O Async\/Await permite lidar com requisi\u00e7\u00f5es ass\u00edncronas e promessas no JavaScript. Aprenda t\u00e9cnicas avan\u00e7adas para otimizar o c\u00f3digo.<\/em>\u00a0<\/p>\n\n\n\n<p>A habilidade de lidar com <strong>requisi\u00e7\u00f5es ass\u00edncronas<\/strong> em <a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/o-que-e-javascript\/\" target=\"_blank\" rel=\"noreferrer noopener\">JavaScript<\/a> \u00e9 fundamental para a constru\u00e7\u00e3o de aplica\u00e7\u00f5es robustas e eficientes.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Neste guia, mergulharemos no universo de <strong>promises (promessas)<\/strong> e Async\/Await, mostrando como aplicar esses conceitos para otimizar o c\u00f3digo e aprimorar a experi\u00eancia do usu\u00e1rio.&nbsp;<\/p>\n\n\n\n<p>Exploraremos desde os fundamentos das promessas at\u00e9 <strong>t\u00e9cnicas avan\u00e7adas de composi\u00e7\u00e3o e gest\u00e3o de erros<\/strong>, proporcionando um conhecimento pr\u00e1tico para aumentar o seu dom\u00ednio sobre o desenvolvimento ass\u00edncrono em JavaScript.&nbsp;<\/p>\n\n\n\n<p>Continue a leitura para saber como aproveitar ao m\u00e1ximo as promises e Async\/Await para criar aplica\u00e7\u00f5es<strong> <\/strong>n\u00e3o bloqueantes!&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>O que s\u00e3o promessas no JavaScript?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>As <strong>promessas no JavaScript<\/strong> s\u00e3o objetos que representam o resultado de uma opera\u00e7\u00e3o ass\u00edncrona que ainda n\u00e3o foi conclu\u00edda, mas que eventualmente resultar\u00e1 em um valor ou em um erro.&nbsp;<\/p>\n\n\n\n<p>Elas s\u00e3o classificadas em tr\u00eas estados:&nbsp;<\/p>\n\n\n\n<ol class=\"wp-block-list\" start=\"1\">\n<li><strong>Pendente<\/strong>: estado inicial da promessa, em que a opera\u00e7\u00e3o est\u00e1 em andamento e seu resultado ainda n\u00e3o est\u00e1 dispon\u00edvel.\u00a0<\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li><strong>Resolvida <\/strong>(fulfilled): a opera\u00e7\u00e3o foi conclu\u00edda com sucesso e o valor esperado foi retornado.\u00a0<\/li>\n<\/ol>\n\n\n\n<ol class=\"wp-block-list\" start=\"3\">\n<li><strong>Rejeitada <\/strong>(rejected): a opera\u00e7\u00e3o ass\u00edncrona falhou e um erro foi retornado.\u00a0<\/li>\n<\/ol>\n\n\n\n<p>As promessas registram <strong>fun\u00e7\u00f5es de retorno de chamada<\/strong> para serem executadas quando a promise for resolvida ou rejeitada, utilizando os m\u00e9todos `.then()` e `.catch()`, respectivamente.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Este m\u00e9todo \u00e9 especialmente \u00fatil em situa\u00e7\u00f5es pr\u00e1ticas, como requisi\u00e7\u00f5es de rede, leitura de arquivos e processamento de grandes volumes de dados, em que a efici\u00eancia e a n\u00e3o obstru\u00e7\u00e3o da execu\u00e7\u00e3o s\u00e3o cruciais.&nbsp;<\/p>\n\n\n\n<p>As promises permitem escrever c\u00f3digo que espera um resultado <strong>sem bloquear a execu\u00e7\u00e3o de outras opera\u00e7\u00f5es<\/strong>, o que \u00e9 importante para manter a fluidez de aplica\u00e7\u00f5es web.\u00a0<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Como criar e usar promessas para requisi\u00e7\u00f5es ass\u00edncronas?<\/strong>&nbsp;<\/h3>\n\n\n\n<p>As promessas s\u00e3o \u00fateis para lidar com opera\u00e7\u00f5es ass\u00edncronas de forma mais clara e organizada em JavaScript.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Vamos demonstrar como criar e utilizar promises para realizar, por exemplo, uma chamada a uma <a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/o-que-e-api\/\" target=\"_blank\" rel=\"noreferrer noopener\">API<\/a>.&nbsp;<\/p>\n\n\n\n<p><em>function fetchData() {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; return new Promise((resolve, reject) =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setTimeout(() =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const data = { id: 1, name: &#8216;John&#8217; };<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resolve(data);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, 2000);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; });<\/em>&nbsp;<\/p>\n\n\n\n<p><em>}<\/em>&nbsp;<\/p>\n\n\n\n<p><em>fetchData()<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .then(data =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(&#8216;Dados obtidos:&#8217;, data);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; })<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .catch(error =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8216;Erro ao obter dados:&#8217;, error);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; });<\/em>&nbsp;<\/p>\n\n\n\n<p>No exemplo, a fun\u00e7\u00e3o `fetchData()` retorna uma promessa que <strong>simula uma requisi\u00e7\u00e3o ass\u00edncrona<\/strong> por meio de um atraso de dois segundos.&nbsp;<\/p>\n\n\n\n<p>Em seguida, utilizamos os m\u00e9todos `.then()` e `.catch()` para lidar com o resultado da promise, <strong>imprimindo os dados obtidos no console<\/strong>, em caso de sucesso, ou exibindo um erro, se houver falha.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>E o que s\u00e3o fun\u00e7\u00f5es Async\/Await?<\/strong>&nbsp;<\/h2>\n\n\n\n<iframe width=\"560\" height=\"315\" src=\"https:\/\/www.youtube.com\/embed\/n3o9cZzrRj4?si=eSDr_oqhA7sAzVs2\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n\n\n\n<p><\/p>\n\n\n\n<p>As fun\u00e7\u00f5es Async\/Await s\u00e3o uma maneira de <a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/porque-aprender-a-escrever-codigos\/\" target=\"_blank\" rel=\"noreferrer noopener\">escrever c\u00f3digo<\/a> ass\u00edncrono em JavaScript de uma forma mais <strong>l\u00f3gica e leg\u00edvel<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Elas s\u00e3o constru\u00eddas sobre o conceito de promessas e oferecem uma <strong>sintaxe limpa e intuitiva<\/strong> para lidar com opera\u00e7\u00f5es ass\u00edncronas.&nbsp;<\/p>\n\n\n\n<p>A palavra-chave \u00b4<strong>async\u00b4 <\/strong>\u00e9 usada antes de uma fun\u00e7\u00e3o para indicar que ela retornar\u00e1 uma promessa.&nbsp;<\/p>\n\n\n\n<p>Em uma fun\u00e7\u00e3o async, voc\u00ea pode usar a palavra-chave \u00b4<strong>await\u00b4 <\/strong>para pausar a execu\u00e7\u00e3o e esperar que uma promise seja resolvida antes de continuar.&nbsp;<\/p>\n\n\n\n<p>Isso permite escrever c\u00f3digo ass\u00edncrono de uma maneira que pare\u00e7a <strong>s\u00edncrona e sequencial<\/strong>, evitando a pir\u00e2mide de callbacks (callback hell) associada a opera\u00e7\u00f5es ass\u00edncronas.&nbsp;<\/p>\n\n\n\n<p>Assim, podemos <strong>encadear chamadas de fun\u00e7\u00e3o ass\u00edncrona<\/strong> de forma mais natural, sem a necessidade de encadeamento complexo de promessas usando `.then()`.&nbsp;<\/p>\n\n\n\n<p>O c\u00f3digo ass\u00edncrono com Async\/Await pode ser facilmente <strong>integrado \u00e0s estruturas de controle<\/strong> como loops `for` e condicionais `if`, tornando a <a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/logica-de-programacao-o-que-e\/\" target=\"_blank\" rel=\"noreferrer noopener\">l\u00f3gica de programa\u00e7\u00e3o<\/a> mais direta.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Como encadear promessas de forma eficiente?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Encadear promessas torna o c\u00f3digo mais leg\u00edvel, especialmente em <strong>projetos grandes e complexos<\/strong>, em que a clareza \u00e9 essencial para a manuten\u00e7\u00e3o e colabora\u00e7\u00e3o.&nbsp;<\/p>\n\n\n\n<p>Quando as promises s\u00e3o encadeadas corretamente, \u00e9 mais simples <strong>adicionar novas funcionalidades<\/strong>, corrigir bugs e fazer altera\u00e7\u00f5es.&nbsp;<\/p>\n\n\n\n<p>Confira as principais estrat\u00e9gias de encadeamento de promessas.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Encadeamento sequencial<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Uma estrat\u00e9gia eficiente \u00e9 encadear promessas sequencialmente, em que <strong>cada uma depende do resultado da anterior<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Isso \u00e9 poss\u00edvel empregando a palavra-chave `await` dentro de uma fun\u00e7\u00e3o ass\u00edncrona ou <strong>encadeando m\u00faltiplas chamadas<\/strong> usando `.then()`, como abaixo:&nbsp;<\/p>\n\n\n\n<p>&nbsp;<em>&nbsp; async function fetchAndProcessData() {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const data1 = await fetchData1();<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const processedData1 = await processData(data1);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const data2 = await fetchData2(processedData1);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const processedData2 = await processData(data2);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return processedData2;<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp; }<\/em>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Encadeamento com `then()`<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Al\u00e9m do `await`, as promessas tamb\u00e9m podem ser encadeadas usando o <strong>m\u00e9todo `.then()`<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Isso \u00e9 \u00fatil quando se deseja realizar v\u00e1rias opera\u00e7\u00f5es em uma promise resolvida <strong>sem esperar que todas as anteriores sejam conclu\u00eddas<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Confira um exemplo de encadeamento com `.then()`:&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp; fetchData1()<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .then(processData)<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .then(fetchData2)<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .then(processData)<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .then(result =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(result);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .catch(error =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(error);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<\/em>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Encadeamento paralelo com promisse.all()<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Se m\u00faltiplas tarefas ass\u00edncronas podem ser <strong>executadas independentemente<\/strong> umas das outras, \u00e9 poss\u00edvel encade\u00e1-las em paralelo usando `Promise.all()`.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Esse m\u00e9todo aceita um <a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/o-que-sao-arrays-em-javascript\/\" target=\"_blank\" rel=\"noreferrer noopener\">array<\/a> de promessas e retorna uma nova promessa, que \u00e9 resolvida, quando todas as promises no array forem resolvidas, ou rejeitada, se uma delas for rejeitada.&nbsp;<\/p>\n\n\n\n<p>Assim, <strong>todas as promises s\u00e3o retornadas simultaneamente<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Um exemplo:&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp; async function fetchAndProcessData() {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const processedData1 = processData(data1);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const processedData2 = processData(data2);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return [processedData1, processedData2];<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp; }<\/em>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Encadeamento com Promise.race()<\/strong>&nbsp;<\/h3>\n\n\n\n<p>O m\u00e9todo `<strong>Promise.race()<\/strong>` tamb\u00e9m aceita um array de promessas, mas retorna uma nova promessa, que \u00e9 resolvida ou rejeitada assim que uma das promises no array for resolvida ou rejeitada.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Exemplo de uso de `Promise.race()`:&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp; const promises = [fetchData1(), fetchData2(), fetchData3()];<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp; Promise.race(promises)<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .then(result =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(result);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .catch(error =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(error);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<\/em>&nbsp;<\/p>\n\n\n\n<p>O m\u00e9todo `Promise.race()` \u00e9 \u00fatil em cen\u00e1rios onde a <strong>resposta mais r\u00e1pida \u00e9 a mais importante<\/strong>.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Por exemplo, em uma <strong>aplica\u00e7\u00e3o que precisa exibir um conte\u00fado rapidamente<\/strong>, podemos usar `Promise.race()` para esperar pela resposta do servidor que chegar primeiro, ignorando as outras.&nbsp;<\/p>\n\n\n\n<p>A abordagem \u00e9 ideal para situa\u00e7\u00f5es como <strong>carregamentos de imagens em uma galeria<\/strong>, em que queremos mostrar a primeira imagem dispon\u00edvel o mais r\u00e1pido poss\u00edvel.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Como gerenciar erros em cadeias ass\u00edncronas de opera\u00e7\u00f5es com JavaScript?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Na <strong>gest\u00e3o de erros<\/strong> em cadeias ass\u00edncronas, \u00e9 essencial adotar estrat\u00e9gias para lidar com poss\u00edveis falhas que possam ocorrer durante a execu\u00e7\u00e3o de promessas ou fun\u00e7\u00f5es usando Async\/Await.&nbsp;<\/p>\n\n\n\n<p>Descubra quais s\u00e3o as melhores pr\u00e1ticas para gerenciar erros de forma eficaz.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Tratamento de erros com try-catch<\/strong>&nbsp;<\/h3>\n\n\n\n<p>O uso de blocos <strong>try-catch<\/strong> \u00e9 uma maneira eficaz de capturar exce\u00e7\u00f5es e lidar com erros de forma controlada.&nbsp;<\/p>\n\n\n\n<p>Ao envolver o c\u00f3digo ass\u00edncrono em um bloco try-catch, podemos <strong>capturar qualquer erro<\/strong> que ocorra durante a execu\u00e7\u00e3o e fornecer um tratamento adequado para ele.&nbsp;<\/p>\n\n\n\n<p>Isso pode incluir a <strong>exibi\u00e7\u00e3o de mensagens<\/strong> para a pessoa usu\u00e1ria, registrando os erros em logs ou executando a\u00e7\u00f5es alternativas para mitigar o problema.&nbsp;<\/p>\n\n\n\n<p>Confira um caso de uso:&nbsp;<\/p>\n\n\n\n<p><em>async function fetchData() {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; try {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const response = await fetch(&#8216;https:\/\/api.example.com\/data&#8217;);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const data = await response.json();<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return data;<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; } catch (error) {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8216;Ocorreu um erro:&#8217;, error);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Error(&#8216;Falha ao buscar os dados.&#8217;);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; }<\/em>&nbsp;<\/p>\n\n\n\n<p><em>}<\/em>&nbsp;<\/p>\n\n\n\n<p><em>fetchData()<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .then(data =&gt; console.log(&#8216;Dados recebidos:&#8217;, data))<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .catch(error =&gt; console.error(&#8216;Erro ao processar os dados:&#8217;, error));<\/em>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Encadeamento de tratamento de erros<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Ao encadear promessas ou fun\u00e7\u00f5es ass\u00edncronas, \u00e9 importante garantir que os erros sejam tratados em <strong>cada etapa do encadeamento<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Isso pode ser feito <strong>adicionando blocos try-catch em cada fun\u00e7\u00e3o ass\u00edncrona<\/strong> ou usando m\u00e9todos como `catch()` para capturar erros em promises encadeadas, conforme abaixo:&nbsp;<\/p>\n\n\n\n<p><em>async function fetchData() {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; try {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const response = await fetch(&#8216;https:\/\/api.example.com\/data&#8217;);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const data = await response.json();<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return data;<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; } catch (error) {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8216;Erro ao buscar os dados:&#8217;, error);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Error(&#8216;Falha ao buscar os dados.&#8217;);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; }<\/em>&nbsp;<\/p>\n\n\n\n<p><em>}<\/em>&nbsp;<\/p>\n\n\n\n<p><em>async function processData() {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; try {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const data = await fetchData();<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \/\/ Processar os dados recebidos<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return processedData;<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; } catch (error) {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8216;Erro ao processar os dados:&#8217;, error);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Error(&#8216;Falha ao processar os dados.&#8217;);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; }<\/em>&nbsp;<\/p>\n\n\n\n<p><em>}<\/em>&nbsp;<\/p>\n\n\n\n<p><em>processData()<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .then(result =&gt; console.log(&#8216;Resultado final:&#8217;, result))<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .catch(error =&gt; console.error(&#8216;Erro ao executar o processo:&#8217;, error));<\/em>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Gest\u00e3o de erros ass\u00edncronos<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Em situa\u00e7\u00f5es em que os erros podem ocorrer de forma ass\u00edncrona em paralelo, como ao utilizar `Promise.all()`, \u00e9 importante garantir que <strong>todos os erros sejam capturados e tratados adequadamente<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Isso \u00e9 poss\u00edvel usando m\u00e9todos como `<strong>Promise.allSettled()<\/strong>` para aguardar o t\u00e9rmino de todas as promessas, independentemente de terem sido resolvidas ou rejeitadas, e depois verificar o status de cada uma para lidar com os erros.&nbsp;<\/p>\n\n\n\n<p>Um exemplo:&nbsp;<\/p>\n\n\n\n<p><em>Promise.allSettled(promises)<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .then(results =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.forEach(result =&gt; {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result.status === &#8216;rejected&#8217;) {<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.error(&#8216;Erro:&#8217;, result.reason);<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; })<\/em>&nbsp;<\/p>\n\n\n\n<p><em>&nbsp;&nbsp;&nbsp; .catch(error =&gt; console.error(&#8216;Erro ao lidar com erros:&#8217;, error));<\/em>&nbsp;<\/p>\n\n\n\n<p><strong>Leia mais<\/strong>:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/ate-onde-vai-o-poder-do-javascript\/\" target=\"_blank\" rel=\"noreferrer noopener\">At\u00e9 onde vai o poder do JavaScript?<\/a>\u00a0<\/li>\n\n\n\n<li><a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/como-usar-javascript-e-php-no-mesmo-projeto\/\" target=\"_blank\" rel=\"noreferrer noopener\">Como usar JavaScript e PHP no mesmo projeto?<\/a>\u00a0<\/li>\n\n\n\n<li><a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/arrays-em-javascript\/\" target=\"_blank\" rel=\"noreferrer noopener\">Quais s\u00e3o as fun\u00e7\u00f5es nativas de arrays em JavaScript?<\/a>\u00a0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Como otimizar o desempenho com Async\/Await?<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"750\" height=\"500\" src=\"https:\/\/www.locaweb.com.br\/blog\/wp-content\/uploads\/2024\/05\/javascript-2-750x500.jpg\" alt=\"Mulher asi\u00e1tica com blusa amarela e branca parece explicar algo a seu gerente enquanto gesticula. Ele tamb\u00e9m \u00e9 asi\u00e1tico, veste uma camisa azul. Olha para a tela de um desktop e parece s\u00e9rio.\" class=\"wp-image-49267\" srcset=\"https:\/\/www.locaweb.com.br\/blog\/wp-content\/uploads\/2024\/05\/javascript-2-750x500.jpg 750w, https:\/\/www.locaweb.com.br\/blog\/wp-content\/uploads\/2024\/05\/javascript-2-480x320.jpg 480w, https:\/\/www.locaweb.com.br\/blog\/wp-content\/uploads\/2024\/05\/javascript-2-768x512.jpg 768w, https:\/\/www.locaweb.com.br\/blog\/wp-content\/uploads\/2024\/05\/javascript-2-150x100.jpg 150w, https:\/\/www.locaweb.com.br\/blog\/wp-content\/uploads\/2024\/05\/javascript-2.jpg 1200w\" sizes=\"(max-width: 750px) 100vw, 750px\" \/><\/figure>\n\n\n\n<p><em>Otimizar o c\u00f3digo ass\u00edncrono reduz o tempo de espera e o consumo de recursos, resultando em uma execu\u00e7\u00e3o mais r\u00e1pida e eficiente das opera\u00e7\u00f5es.<\/em>\u00a0<\/p>\n\n\n\n<p>Ao aplicar essas estrat\u00e9gias de otimiza\u00e7\u00e3o de desempenho com Async\/Await e promessas em JavaScript, podemos criar <strong>aplica\u00e7\u00f5es mais r\u00e1pidas e eficientes<\/strong>, proporcionando uma melhor experi\u00eancia \u00e0s pessoas usu\u00e1rias finais.&nbsp;<\/p>\n\n\n\n<p>Confira as principais estrat\u00e9gias de otimiza\u00e7\u00e3o com Async\/Await em JavaScript:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Utilizar apenas quando necess\u00e1rio<\/strong>: evite usar Async\/Await em opera\u00e7\u00f5es s\u00edncronas simples, que podem ser tratadas de forma mais eficiente com m\u00e9todos s\u00edncronos.\u00a0<\/li>\n\n\n\n<li><strong>Agrupar opera\u00e7\u00f5es ass\u00edncronas<\/strong>: quando poss\u00edvel, agrupe v\u00e1rias opera\u00e7\u00f5es ass\u00edncronas em uma \u00fanica fun\u00e7\u00e3o para reduzir o n\u00famero de chamadas e minimizar o tempo de espera.\u00a0<\/li>\n\n\n\n<li><strong>Utilizar Promise.all() para opera\u00e7\u00f5es independentes<\/strong>: quando tiver v\u00e1rias opera\u00e7\u00f5es ass\u00edncronas independentes, utilize Promise.all() para execut\u00e1-las simultaneamente e aguardar que todas as promessas sejam resolvidas de maneira eficiente.\u00a0<\/li>\n\n\n\n<li><strong>Gerenciar exce\u00e7\u00f5es adequadamente<\/strong>: certifique-se de lidar com erros de forma eficaz usando blocos try-catch para capturar exce\u00e7\u00f5es e tratar erros apropriadamente, garantindo que o c\u00f3digo n\u00e3o pare de executar em caso de falha.\u00a0<\/li>\n\n\n\n<li><strong>Evitar bloqueios desnecess\u00e1rios<\/strong>: evite bloquear a thread principal do JavaScript com opera\u00e7\u00f5es ass\u00edncronas longas. Se poss\u00edvel, divida tarefas demoradas em partes menores e execute-as de maneira ass\u00edncrona em segundo plano, liberando a thread principal para outras opera\u00e7\u00f5es.\u00a0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Onde aplicar Async\/Await?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>No <strong>desenvolvimento de aplica\u00e7\u00f5es<\/strong>, lidar com opera\u00e7\u00f5es ass\u00edncronas \u00e9 uma necessidade comum.&nbsp;&nbsp;<\/p>\n\n\n\n<p>Ao permitir escrever o c\u00f3digo ass\u00edncrono com Async\/Await \u00e9 oferecida uma <strong>abordagem mais intuitiva e leg\u00edvel<\/strong>, facilitando a manuten\u00e7\u00e3o.&nbsp;<\/p>\n\n\n\n<p>Seja ao fazer solicita\u00e7\u00f5es de rede, seja ao acessar bancos de dados ou executar tarefas de longa dura\u00e7\u00e3o, a capacidade de gerenciar essas opera\u00e7\u00f5es \u00e9 fundamental para o <strong>desempenho e a experi\u00eancia do usu\u00e1rio<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Conhe\u00e7a alguns casos de uso das fun\u00e7\u00f5es.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Requisi\u00e7\u00f5es de API<\/strong>&nbsp;<\/h3>\n\n\n\n<p>\u00c9 poss\u00edvel usar o Async\/Await para fazer <strong>chamadas HTTP<\/strong> para recuperar dados de um servidor em requisi\u00e7\u00f5es de API.&nbsp;<\/p>\n\n\n\n<p>Isso pode incluir a recupera\u00e7\u00e3o de um banco de dados remoto, <strong>integra\u00e7\u00e3o com servi\u00e7os de terceiros<\/strong> ou obten\u00e7\u00e3o de informa\u00e7\u00f5es din\u00e2micas para atualizar a interface do usu\u00e1rio.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Opera\u00e7\u00f5es de E\/S intensiva<\/strong>&nbsp;<\/h3>\n\n\n\n<p>As fun\u00e7\u00f5es Async\/Await s\u00e3o \u00fateis para opera\u00e7\u00f5es de entrada\/sa\u00edda intensivas, como leitura\/grava\u00e7\u00e3o de arquivos, processamento de imagens ou <strong>acesso a <\/strong><a href=\"https:\/\/www.locaweb.com.br\/blog\/produtos\/vps-e-cloud\/banco-de-dados-3-coisas-que-todo-desenvolvedor-precisa-saber\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>bancos de dados<\/strong><\/a>.&nbsp;<\/p>\n\n\n\n<p>Essas opera\u00e7\u00f5es geralmente s\u00e3o ass\u00edncronas e podem bloquear a thread principal, se forem executadas de forma s\u00edncrona.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o&nbsp;<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Ao lidar com autentica\u00e7\u00e3o de usu\u00e1rio, autoriza\u00e7\u00e3o e gerenciamento de sess\u00f5es, \u00e9 comum fazer chamadas ass\u00edncronas para <strong>verificar credenciais<\/strong>, validar tokens ou recuperar informa\u00e7\u00f5es de perfil do usu\u00e1rio.&nbsp;&nbsp;<\/p>\n\n\n\n<p>As fun\u00e7\u00f5es Async\/Await simplificam a <strong>l\u00f3gica de autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o<\/strong>, garantindo que essas opera\u00e7\u00f5es sejam executadas de forma eficiente.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Manipula\u00e7\u00e3o de eventos e interface do usu\u00e1rio<\/strong>&nbsp;<\/h3>\n\n\n\n<p>Em aplica\u00e7\u00f5es web e m\u00f3veis, Async\/Await pode ser usado para lidar com eventos ass\u00edncronos, como <strong>cliques de bot\u00f5es<\/strong>, envios de formul\u00e1rios ou atualiza\u00e7\u00f5es de estado da interface do usu\u00e1rio.&nbsp;<\/p>\n\n\n\n<p>Assim, \u00e9 poss\u00edvel criar <strong>intera\u00e7\u00f5es din\u00e2micas<\/strong>, mas sem bloquear a interface do usu\u00e1rio durante opera\u00e7\u00f5es ass\u00edncronas.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Opera\u00e7\u00f5es em segundo plano<\/strong>&nbsp;<\/h3>\n\n\n\n<p>As fun\u00e7\u00f5es possibilitam executar tarefas ass\u00edncronas em paralelo \u00e0 intera\u00e7\u00e3o da pessoa usu\u00e1ria, melhorando a efici\u00eancia e a <strong>capacidade de resposta da aplica\u00e7\u00e3o<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Sendo assim, Async\/Await pode realizar <strong>opera\u00e7\u00f5es em segundo plano<\/strong> em aplica\u00e7\u00f5es web, como processamento de dados em lotes, atualiza\u00e7\u00f5es autom\u00e1ticas ou sincroniza\u00e7\u00e3o de dados.&nbsp;&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Quais pr\u00e1ticas adotar para garantir um c\u00f3digo ass\u00edncrono limpo e eficiente?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Ao aplicar boas pr\u00e1ticas, as pessoas desenvolvedoras aproveitam ao m\u00e1ximo o Async\/Await em suas aplica\u00e7\u00f5es, criando <a href=\"https:\/\/www.locaweb.com.br\/blog\/temas\/codigo-aberto\/clean-code-melhores-praticas-ao-programar\/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>c\u00f3digo limpo<\/strong><\/a> <strong>e f\u00e1cil de manter<\/strong>.&nbsp;<\/p>\n\n\n\n<p>Confira as melhores pr\u00e1ticas para garantir um c\u00f3digo ass\u00edncrono eficiente.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gerenciamento de erros<\/strong>: sempre utilize blocos try-catch para capturar e lidar com erros em opera\u00e7\u00f5es ass\u00edncronas para garantir que a aplica\u00e7\u00e3o possa se recuperar de falhas adequadamente e fornecer feedback \u00fatil \u00e0 pessoa usu\u00e1ria.\u00a0<\/li>\n\n\n\n<li><strong>Desacoplamento e modularidade<\/strong>: separe a l\u00f3gica ass\u00edncrona em fun\u00e7\u00f5es reutiliz\u00e1veis e modularize seu c\u00f3digo para promover a coes\u00e3o e o baixo acoplamento entre os componentes. Isso facilita a manuten\u00e7\u00e3o e a escalabilidade ao longo do tempo.\u00a0<\/li>\n\n\n\n<li><strong>Uso respons\u00e1vel de await<\/strong>: evite o uso excessivo de await em cadeias longas de promessas, pois isso pode levar a bloqueios e atrasos na execu\u00e7\u00e3o do c\u00f3digo. Em vez disso, considere usar m\u00e9todos como Promise.all() para executar v\u00e1rias opera\u00e7\u00f5es ass\u00edncronas em paralelo.\u00a0<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Testes unit\u00e1rios e de integra\u00e7\u00e3o<\/strong>: certifique-se de testar adequadamente o c\u00f3digo ass\u00edncrono usando estruturas de teste como Jest, Mocha ou Jasmine, para que ele funcione conforme o esperado em diferentes cen\u00e1rios e condi\u00e7\u00f5es de uso.\u00a0<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Como lidar com o uso intensivo de requisi\u00e7\u00f5es ass\u00edncronas?<\/strong>&nbsp;<\/h2>\n\n\n\n<p>Com um servidor VPS Locaweb, voc\u00ea garante flexibilidade e autonomia para suas aplica\u00e7\u00f5es baseadas em JavaScript, aproveitando todos os recursos de um servidor f\u00edsico, s\u00f3 que virtualizados na nuvem.&nbsp;<\/p>\n\n\n\n<div class=\"user-cta-block\" style=\"background-color:#2E333C;\"><p>Impulsione o desempenho das suas aplica\u00e7\u00f5es JavaScript com o servidor VPS da Locaweb.<\/p><a class=\"user-cta\" style=\"background-color: #00acc8;\" href=\"https:\/\/www.locaweb.com.br\/servidor-vps\/?utm_source=blog&#038;utm_medium=own&#038;utm_campaign=blog-servidor-vps-javascript&#038;utm_id=blog-vendas\" target=\"_blank\" rel=\"noopener\">Clique aqui!<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"<p>O Async\/Await permite lidar com requisi\u00e7\u00f5es ass\u00edncronas e promessas no JavaScript. Aprenda t\u00e9cnicas avan\u00e7adas para otimizar o c\u00f3digo.\u00a0 A habilidade de lidar com requisi\u00e7\u00f5es ass\u00edncronas em JavaScript \u00e9 fundamental para a constru\u00e7\u00e3o de aplica\u00e7\u00f5es robustas e eficientes.&nbsp;&nbsp; Neste guia, mergulharemos no universo de promises (promessas) e Async\/Await, mostrando como aplicar esses conceitos para otimizar o [&hellip;]<\/p>\n","protected":false},"author":24,"featured_media":49263,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[5],"tags":[],"class_list":["post-49257","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-aberto"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/49257","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/users\/24"}],"replies":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/comments?post=49257"}],"version-history":[{"count":6,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/49257\/revisions"}],"predecessor-version":[{"id":49268,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/posts\/49257\/revisions\/49268"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media\/49263"}],"wp:attachment":[{"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/media?parent=49257"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/categories?post=49257"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.locaweb.com.br\/blog\/wp-json\/wp\/v2\/tags?post=49257"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}