Publicado em

Async/Await em JavaScript

Partilhar:

Introdução

A introdução de async e await no JavaScript ES7 marcou um avanço significativo na maneira de escrever e gerir código assíncrono. Este artigo explora em detalhes como utilizar async e await para lidar com diversas situações assíncronas, com ênfase em padrões avançados e melhores práticas.

Conceitos Fundamentais de Async/Await

Async

Uma função declarada como async retorna uma Promise implicitamente, e o valor retornado pela função é usado para resolver essa Promise.

async function operacaoAssincrona() {
  return 'Resultado';
}

// Retorna uma Promise que resolve para 'Resultado'

Await

Await é usado dentro de funções async para pausar a execução da função até que a Promise seja resolvida ou rejeitada.

async function obterDados(url) {
  let resposta = await fetch(url);
  let dados = await resposta.json();

  return dados;
  // A execução pausa até que a Promise de fetch seja resolvida
}

Padrões Avançados de Uso

Execução Paralela

Para executar operações assíncronas em paralelo, você pode usar Promise.all com await.

async function carregarDadosParalelos(urls) {
  let promises = urls.map(url => fetch(url).then(res => res.json()));
  return await Promise.all(promises);
}

Await em Loop

Embora geralmente seja recomendado evitar await dentro de loops, em certos casos, como quando as operações precisam ser sequenciais, isso pode ser necessário.

async function processamentoSequencial(urls) {
  for (let url of urls) {
    let dados = await fetch(url).then(res => res.json());
    console.log(dados);
  }
}

Tratamento de Erros com Async/Await

O tratamento de erros em funções async é realizado através de blocos try-catch.

Capturando Erros

async function carregarDados(url) {
  try {
    let resposta = await fetch(url);
    return await resposta.json();
  } catch (erro) {
    console.error('Erro ao carregar dados:', erro);
  }
}

Melhores Práticas e Dicas

  1. Use Async/Await em Contextos Apropriados: Evite usar async e await para operações simples que não beneficiam da assincronia.
  2. Evite Await Desnecessário: Não use await com operações que já são síncronas, pois isso pode introduzir atrasos desnecessários.
  3. Combine com Promises quando Necessário: Em situações complexas, a combinação de async/await com a API de Promises tradicional pode oferecer mais flexibilidade.
  4. Use Async/Await para Simplificar Código Assíncrono: Em vez de encadear várias Promises com .then(), considere reestruturar o código usando async/await para maior clareza.

Desmistificando Async/Await

Erros Comuns

  • Esquecer await: Esquecer de adicionar await pode levar a comportamentos inesperados, pois o código seguinte pode ser executado antes da conclusão da operação assíncrona.
  • Bloqueio Involuntário: O uso inadequado do await pode bloquear a execução de outras operações assíncronas importantes.

Uso em Funções Anônimas

Async/await também pode ser usado em funções anônimas:

document.addEventListener('click', async function() {
  let dados = await carregarDados('https://api.exemplo.com');
  console.log(dados);
});

Conclusão

Async e await transformaram a abordagem para a programação assíncrona em JavaScript, tornando o código mais intuitivo e fácil de seguir. Compreender como aplicar estes conceitos eficientemente é crucial para qualquer desenvolvedor que trabalhe com JavaScript, especialmente em aplicações web modernas que dependem fortemente de operações assíncronas.

Happy coding!