JavaScript/Assincronismo/Async/Await
JavaScript⏱ ~2 min de leitura

Async/Await

Código assíncrono de forma síncrona

async/await é uma sintaxe sobre Promises que permite escrever código assíncrono de forma linear — sem encadeamentos de .then(). Uma função marcada com async sempre retorna uma Promise. Dentro dela, await pausa a execução da função até a Promise resolver, sem bloquear a thread principal.

Em termos práticos, async/await torna o código assíncrono idêntico ao síncrono na aparência. Em vez de .then() e .catch(), você usa try/catch tradicional. Em vez de Promise.all(), você usa await Promise.all(). Tudo que funciona com Promises funciona com async/await.

Um erro comum é usar await dentro de um loop for...of de forma sequencial quando as operações são independentes. await dentro de forEach não funciona como esperado — use for...of com await ou Promise.all() com map() para execução em paralelo.

Exemplo.java
// ── Função async ──────────────────────────────────
async function buscarUsuario(id) {
  const res = await fetch(`/api/usuarios/${id}`);
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
  return res.json(); // await implícito: retorna Promise<User>
}

// ── try/catch para erros ──────────────────────────
async function carregar() {
  try {
    const usuario = await buscarUsuario(1);
    const pedidos = await buscarPedidos(usuario.id); // sequencial
    exibir(usuario, pedidos);
  } catch (erro) {
    console.error("Falha:", erro.message);
  } finally {
    esconderLoading();
  }
}

// ── Paralelo: await Promise.all ───────────────────
async function carregarDados() {
  // ❌ Sequencial — desnecessariamente lento:
  // const u = await fetchUsuario();
  // const p = await fetchProdutos();

  // ✅ Paralelo — muito mais rápido:
  const [usuario, produtos] = await Promise.all([
    fetchUsuario(),
    fetchProdutos(),
  ]);
  return { usuario, produtos };
}

// ── IIFE async (executar imediatamente) ───────────
(async () => {
  const dados = await carregarDados();
  console.log(dados);
})();

// ── await em top-level (módulos ES2022) ───────────
// const config = await fetch("/config.json").then(r => r.json());
💡 Dica pro

await só pode ser usado dentro de funções async. Para erros específicos, capture por tipo: catch (e) { if (e instanceof NetworkError) ... }. Sempre trate erros — Promises rejeitadas sem catch causam UnhandledPromiseRejection.

Recompensa+40 XP+exercícios