Skip to content
Latchkey

O que é Async/Await? Escrever código assíncrono de forma limpa

Async/await é uma sintaxe que permite escrever código assíncrono e não bloqueante em um estilo linear que se lê quase como código sequencial normal.

Código assíncrono permite que um programa inicie uma operação lenta (uma chamada de rede, uma leitura de disco) e continue fazendo outro trabalho em vez de bloquear até ela terminar. Historicamente isso significava callbacks aninhados. Async/await é açúcar sintático sobre promises (ou futures) que achata esses callbacks em código que você pode ler de cima para baixo, ainda sendo não bloqueante por baixo.

O problema que async/await resolve

Sem ele, trabalho assíncrono significa callbacks ou promises encadeadas, que aninham e emaranham conforme a lógica cresce. Async/await permite await um resultado como se fosse síncrono, enquanto o runtime libera a thread para fazer outro trabalho até o resultado estar pronto.

Como funciona por baixo

Uma função async retorna uma promise. Quando ela atinge um await, suspende e cede o controle de volta ao event loop; quando a promise aguardada resolve, a função retoma de onde parou. Nenhuma thread fica bloqueada durante a espera.

Erros comuns

  • Esquecer de dar await em uma promise, então o código roda antes de estar pronto.
  • Dar await em um loop quando as chamadas poderiam rodar concorrentemente.
  • Não tratar promises rejeitadas, levando a erros não tratados.
  • Assumir que código async é paralelo; em uma thread ele é intercalado.

Async não é o mesmo que paralelo

Em um runtime single-threaded como o Node.js, async/await intercala o trabalho; não roda JavaScript em paralelo. Ele brilha para trabalho I/O-bound (esperar na rede), mas não acelera computação CPU-bound.

Um exemplo rápido

Escrever const data = await fetch(url); se lê como uma chamada bloqueante, mas o runtime fica livre para tratar outro trabalho enquanto o request de rede está em andamento, e então retoma esta linha quando a resposta chega.

Async/await no CI

Uma causa frequente de testes flaky é um await esquecido: o teste faz assert antes de o trabalho assíncrono terminar, passando ou falhando por timing. Essas races falham de forma intermitente em runners ocupados. A Latchkey pode dar retry automático em falhas transitórias enquanto você corrige o await ausente, para que uma execução flaky não bloqueie um merge.

Principais conclusões

  • Async/await escreve código não bloqueante em um estilo legível e sequencial.
  • Uma função async suspende no await e retoma quando a promise aguardada resolve.
  • É ótimo para I/O, mas não é paralelismo; awaits esquecidos causam testes flaky.

Guias relacionados