sexta-feira, 31 de julho de 2026 · Edição online
TNT Web
TNT Web

Async await ou Promises: qual usar em JavaScript?

ResumoAsync/await e Promises em JavaScript são abordagens para operações assíncronas. Promises fornecem encadeamento e controle granular com métodos como .then() e .catch(). Async/await simplifica a sintaxe, tornando o código mais legível e próximo do síncrono. A escolha entre async/await ou Promises depende do contexto: async/await favorece clareza em fluxos lineares, enquanto Promises são melhores para composição complexa.

Async/await e Promises são ferramentas para lidar com operações assíncronas em JavaScript. Enquanto Promises oferecem um controle mais granular com encadeamento, async/await simplifica a leitura do código, tornando-o mais próximo do síncrono. A escolha depende do contexto e da ne

Eloá Pimentel Eloá Pimentel · Repórter de comportamento
· · 4 min de leitura
Async await ou Promises: qual usar em JavaScript?
Foto: Imagem ilustrativa · TNT Web

Async/await e Promises são ferramentas para lidar com operações assíncronas em JavaScript. Enquanto Promises oferecem um controle mais granular com encadeamento, async/await simplifica a leitura do código, tornando-o mais próximo do síncrono. A escolha depende do contexto e da ne

Quem desenvolve em JavaScript cedo ou tarde enfrenta o dilema entre escrever código assíncrono com Promises ou com a sintaxe async/await. Ambas resolvem o mesmo problema, evitar o bloqueio da thread principal enquanto uma operação é concluída, mas cada uma tem seu jeito de fazer isso. O que muda é a legibilidade, o tratamento de erros e a forma como você lida com múltiplas tarefas ao mesmo tempo.

Legibilidade: async/await deixa o código mais limpo

Promises usam encadeamento com .then() e .catch(). Para uma sequência simples, funciona bem:

fetchDados() .then(dados => processar(dados)) .then(resultado => console.log(resultado)) .catch(erro => console.error(erro));

Async/await transforma esse encadeamento em algo que parece síncrono:

async function executar() { try { const dados = await fetchDados(); const resultado = await processar(dados); console.log(resultado); } catch (erro) { console.error(erro); } }

Para quem está começando ou mantém um código com muitas operações sequenciais, async/await reduz a carga cognitiva. O fluxo fica mais claro.

Tratamento de erros: try/catch vs .catch()

Com Promises, o erro de qualquer etapa do encadeamento cai no .catch() final. Isso funciona, mas pode esconder onde exatamente a falha ocorreu se você não nomear os erros.

Async/await usa o bloco try/catch tradicional. Você pode envolver trechos específicos em seus próprios try/catch, isolando falhas com mais precisão. Um exemplo concreto: se você tem duas chamadas de API independentes, com async/await pode capturar o erro de cada uma separadamente sem que uma derrube a outra.

Concorrência: Promises vencem em paralelismo

Async/await é sequencial por natureza. Quando você escreve:

const a = await requisicaoA(); const b = await requisicaoB();

A segunda espera a primeira terminar, mesmo que não haja dependência entre elas. Para executar em paralelo, você precisa usar Promise.all():

const [a, b] = await Promise.all([requisicaoA(), requisicaoB()]);

Promises, por outro lado, já nascem com métodos como Promise.all() e Promise.race() que facilitam o paralelismo. Se o seu cenário exige disparar várias operações ao mesmo tempo e aguardar todas, Promises com .then() podem ser mais diretas.

Depuração: async/await gera stack traces melhores

Em Promises encadeadas, quando um erro ocorre dentro de um .then(), a stack trace pode apontar para a linha da função anônima, não para onde a Promise foi criada. Isso dificulta encontrar a origem do problema.

Async/await preserva a stack trace do ponto exato onde o await foi chamado. Em depuração, você vê o caminho completo até a falha, o que acelera a correção.

Performance: diferença negligenciável

Em termos de velocidade bruta, a diferença entre usar Promises e async/await é mínima na maioria dos cenários. O motor V8 otimiza ambas as formas de maneira similar. A escolha não deve ser baseada em performance, a menos que você esteja lidando com milhares de operações simultâneas em um loop crítico, nesse caso, vale medir com ferramentas de profiling.

Veredito: quando usar cada um

Para quem busca clareza em operações sequenciais e facilidade de manutenção: async/await é a escolha. Ele reduz o aninhamento e torna o código mais legível para quem não está acostumado com programação assíncrona.

Para quem precisa de controle fino sobre concorrência, como disparar várias requisições independentes e reagir à medida que cada uma termina: Promises com .then() e métodos como Promise.all() ou Promise.race() oferecem mais flexibilidade.

Na prática, os dois não são excludentes. Você pode usar async/await para a maior parte do código e recorrer a Promise.all() dentro dele quando precisar de paralelismo. O importante é entender o que cada abordagem prioriza e aplicar de acordo com o problema.

Perguntas frequentes

Async/await substitui Promises?

Não. Async/await é uma sintaxe que opera sobre Promises. Por baixo dos panos, uma função async sempre retorna uma Promise. Você continua usando Promises; a diferença é como escreve o código.

É possível misturar async/await com .then()?

Sim. Você pode usar await dentro de uma função async e ainda chamar .then() no resultado, se fizer sentido. Mas misturar os dois no mesmo trecho pode confundir a leitura. O ideal é escolher um padrão e mantê-lo.

Async/await é mais lento que Promises?

Em operações comuns, a diferença de performance é irrelevante para a experiência do usuário. A engine JavaScript otimiza ambos. A escolha deve priorizar legibilidade e manutenibilidade.

Quando usar Promise.all() com async/await?

Sempre que você tiver operações independentes que podem rodar em paralelo. Em vez de escrever dois awaits sequenciais, coloque as Promises dentro de Promise.all() e use await uma vez. Isso reduz o tempo total de execução.

Como tratar erros em async/await?

Use try/catch. Você pode envolver todo o bloco em um único try/catch ou criar blocos menores para isolar falhas específicas. Isso dá mais controle sobre qual erro tratar de que forma.

Vale a pena migrar código legado de Promises para async/await?

Depende. Se o código existente funciona e é mantido por uma equipe acostumada com Promises, não há pressa. Se você está refatorando para melhorar legibilidade ou onboardar novos desenvolvedores, async/await pode valer o esforço.

Compartilhar:
Eloá Pimentel

Eloá Pimentel

Repórter de comportamento

Repórter de comportamento.

Ver todos os artigos →

Leia também

Checklist code review: 12 itens para revisar antes
Apps e Software

Checklist code review: 12 itens para revisar antes

Um bom code review começa antes do pull request. Este checklist reúne os itens essenciais para preparar seu código, economizar tempo do revisor e evitar retrabalho.

31 de julho de 2026 · Jonas Ribaldo
Migrar TypeScript: 7 passos em projeto JavaScript existente
Apps e Software

Migrar TypeScript: 7 passos em projeto JavaScript existente

Migrar TypeScript em um projeto JavaScript existente parece trabalhoso, mas com um plano passo a passo é possível fazer a transição sem parar o time. Veja como começar.

31 de julho de 2026 · Dani Travassos
Injeção de Dependência: O que é e como implementar
Apps e Software

Injeção de Dependência: O que é e como implementar

Injeção de dependência é um padrão de projeto que reduz o acoplamento entre módulos de um sistema. Neste guia, você aprende o conceito, os tipos de injeção e um passo a passo simples para implementar em Java, C# ou Python.

30 de julho de 2026 · Dani Travassos

Gostou? Receba mais análises

Newsletter quinzenal · curadoria editorial · sem spam