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.
// ── 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());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.