Como usar async e await no JavaScript

Vamos descobrir como async e await simplificam o código JavaScript assíncrono. Async e await são como uma dupla dinâmica que tornam o trabalho com promessas muito mais direto, parecendo quase um script sequencial. Enquanto o async marca uma função como assíncrona, o await é usado dentro dessa função para pausar a execução até que uma promessa seja resolvida.
Imagine ter que lidar com várias ações ao mesmo tempo sem se perder. Async e await ajudam a manter seu código limpo e fácil de ler. Isso é especialmente útil quando você está lidando com muitos dados ou operações que demoram para completar. Tornar a lógica assíncrona mais linear ajuda a evitar aquela bagunça de callbacks, tornando o código mais fácil de manter e entender.
O que são promises no JavaScript?
Promises no JavaScript são uma forma elegante de lidar com operações assíncronas. Imagine que você pediu algo com antecedência, como uma pizza. O pedido é feito, mas a pizza não está pronta imediatamente; você espera até que esteja pronta para depois saborear. Promises funcionam de maneira semelhante.
Elas começam em um estado chamado pendente—como quando a pizza está sendo feita. Uma promise pode mudar para realizada se tudo der certo (a pizza está pronta!) ou para rejeitada se algo der errado (sem pizza porque o forno quebrou). Esses estados ajudam a gerenciar o que acontece em cada possível resultado.
Usando o .then()
e .catch()
, você pode dizer ao seu código o que fazer quando a promise é realizada ou rejeitada. O .then()
cuida do sucesso, enquanto o .catch()
lida com erros. Isso permite que seu código continue rodando enquanto espera pela resolução da promise, agilizando suas aplicações e tornando-as bem mais eficientes.
Vantagens do uso de Async/Await
O uso de async/await tem transformado a forma como os desenvolvedores lidam com operações assíncronas no JavaScript. As principais vantagens do async/await em comparação com as tradicionais promessas encadeadas com .then() e .catch() são a simplicidade do código e a melhor legibilidade.
Por exemplo, quando você escreve código síncrono, normalmente segue uma sequência natural de leitura, tornando-o mais fácil de entender e manter. Esse mesmo benefício se aplica ao async/await, pois permite que o código pareça mais linear e menos fragmentado.
Com async/await, a captura de erros se torna muito mais intuitiva e eficiente pelo uso de try/catch. Diferentemente dos métodos tradicionais que muitas vezes exigem encadeamento de várias promessas para lidar com erros, com try/catch, você simplesmente coloca o bloco de código onde a operação assíncrona ocorre. Isso faz com que o tratamento de erros seja claro e direto, simplificando a depuração de código.
Como utilizar async e await na prática
Vamos colocar a mão na massa e explorar como usar async
e await
em JavaScript para lidar com promessas de forma fácil. Para começar, imagine que precisamos fazer uma chamada a uma API fictícia para buscar dados de um usuário.
Aqui está um pequeno exemplo para clarear as ideias:
async function buscarUsuario() {
try {
const resposta = await fetch('https://api.exemplo.com/usuario');
const dados = await resposta.json();
console.log(dados);
} catch (erro) {
console.error('Erro ao buscar usuário:', erro);
}
}
buscarUsuario();
Entendendo o código
- async antes da função: Declara que a função
buscarUsuario
é assíncrona. - await antes de fetch: Pausa a execução até que a promessa do
fetch
seja resolvida. Em outras palavras, ele espera a resposta da API antes de avançar. - Tratamento de erro com try e catch: Essencial para lidar com problemas caso algo dê errado na chamada da API.
Por que usar async e await?
- Mais legível: Ao invés de aninhar várias
then()
para processar promessas,async
eawait
permitem escrever código que parece síncrono, tornando-o mais fácil de entender e manter. - Erros simplificados: Usando
try
ecatch
, lidamos com erros de maneira mais clara do que encadeandocatch()
.
Esse exemplo é um passo simples no uso desses recursos poderosos. Quando precisa obter dados de uma API, algumas linhas de código com async
e await
transformam seu jeito de trabalhar com promessas, deixando-o mais eficiente.
Diferencias entre async/await e .then()/catch()
Usar promessas no JavaScript é essencial quando lidamos com operações assíncronas. Dois métodos populares são o async/await
e o padrão then()/catch()
. Entender suas diferenças pode ajudar bastante na escolha do melhor para o seu projeto.
Legibilidade do código
Há quem prefira async/await
pela simplicidade e clareza que proporciona ao código. Quando usamos async/await
, o fluxo de operações assíncronas fica mais parecido com o código síncrono. Isso torna mais fácil de ler, especialmente em funções que dependem de vários passos assíncronos. Um código legível facilita a vida não só de quem escreve, mas também de quem precisa dar manutenção depois.
Já o padrão then()/catch()
ajuda em casos onde precisamos lidar com múltiplas promessas em sequência ou encadeadas. Ele pode ser mais direto ao ponto quando há ítens como promessas paralelas, já que as expressões encadeadas permitem tratar cada etapa separadamente. A legibilidade do código é menos intuitiva, mas algumas pessoas gostam pela flexibilidade.
Manutenção do código
No quesito manutenção, async/await
pode sair na frente, principalmente por se integrar de forma mais clara ao fluxo tradicional de try/catch para lidar com erros. Isso limita o risco de confusões ao tratar exceções nas operações assíncronas, algo que pode ser mais complexo com then()/catch()
. Esses dois métodos ajudam muito a melhorar a manutenabilidade do código ao longo do tempo.
Escolher entre async/await
e .then()/catch()
muitas vezes depende do conforto pessoal e da natureza das tarefas que você está lidando. Caso ainda esteja explorando formas eficientes de trabalhar em JavaScript, pode ser útil aprender sobre o uso de métodos como map, filter e reduce. Entender essas técnicas pode fornecer maneiras ainda mais poderosas de manipular dados.
Erros comuns e como evitá-los
Quando se trata de usar async/await
na programação, alguns deslizes acontecem frequentemente entre os desenvolvedores. Vamos dar uma olhada em alguns desses erros e como você pode evitá-los.
- Esquecer de usar await: Um dos erros mais comuns é esquecer de usar
await
antes de chamarmos uma função assíncrona. Isso pode levar a um comportamento inesperado no código. Sempre confira se está usandoawait
para garantir que a função seja concluída antes de seguir adiante.
async function pegarDados() {
let resposta = await fetch('https://api.exemplo.com/dados');
let dados = resposta.json();
console.log(dados);
}
Na função acima, sem await
, o console.log
poderia ser executado antes que os dados fossem realmente retornados.
- Não declarar a função como async: Outro erro frequente é esquecer de adicionar a palavra-chave
async
à assinatura da função. Isso faz com que o uso deawait
dentro daquela função gere erros. Lembre-se: onde háawait
, precisa haverasync
.
function obterUsuarios() {
let usuarios = await pegarUsuariosAPI();
console.log(usuarios);
}
Sem o async
, await
causará um erro de sintaxe. Fique atento ao definir suas funções assíncronas.
- Tratar exceções inadequadamente: As funções
async/await
podem lançar exceções que precisam ser tratadas adequadamente comtry/catch
para evitar que o programa quebre inesperadamente.
async function carregarDados() {
try {
let dados = await algoQuePodeFalhar();
console.log(dados);
} catch (erro) {
console.error('Erro ao carregar dados:', erro);
}
}
O bloco try/catch
ajuda a lidar com erros nas operações assíncronas, mantendo seu aplicativo mais robusto.
Manter esses pontos em mente ajudará a evitar muitos dos obstáculos comuns encontrados ao usar async/await
. Dominar esses conceitos deixará seu código mais fluido e fácil de manter.
Casos de uso e boas práticas
Quando se trata de usar async/await
, há cenários em programação onde essa combinação realmente brilha. Uma situação comum é lidar com operações de entrada/saída, como acessar bancos de dados ou manipular arquivos grandes, onde a espera é inevitável. Imagine, por exemplo, que você precisa carregar dados de um servidor remoto. Com async/await
, enquanto uma solicitação está sendo processada, seu código pode continuar sem ficar travado, o que é uma benção para aplicações que exigem responsividade.
Chamadas de API em série se beneficiam igualmente. Quando algumas operações precisam ser executadas em ordem sem atrapalhar o desempenho da aplicação, async/await
garante que cada passo seja realizado no momento certo. Para aproveitar ao máximo essa funcionalidade, adotar boas práticas é crucial. Sempre capture erros nas operações assíncronas para evitar que problemas passem despercebidos.
Pensando na organização do código, é importante utilizar a declaração de variáveis com var, let, e const para definir variáveis de maneira clara e previsível, garantindo código limpo e menos propenso a erros.
Conclusão
A adoção de async/await
no desenvolvimento com JavaScript trouxe inúmeras vantagens, desde simplificar o código até facilitar a leitura e manutenção. Com async/await
, é possível trabalhar com promessas de forma mais intuitiva, deixando o código assíncrono mais parecido com o síncrono.
Quando usar async/await
? Sempre que possível! Principalmente em operações que envolvem chamadas a APIs, leitura de arquivos ou qualquer tarefa que exija esperar por uma resposta. Essa ferramenta melhora a clareza e desempenho do seu código, tornando o desenvolvimento mais eficiente e moderno.
Quer saber mais sobre JavaScript? Confira como exibir variáveis em JavaScript no nosso blog. Essa leitura pode complementar seu entendimento sobre manipulação de dados na linguagem, ajudando a aprimorar suas habilidades.