JavaScript Assincronia Intermediário
async e await
Em JavaScript, código assíncrono costuma ser escrito com Promises. As palavras-chave async e await tornam esse código mais legível, parecido com código síncrono. Uma função async sempre retorna uma Promise, e dentro dela podemos usar await para esperar a resolução de outra Promise sem bloquear a thread principal.
O await só pode ser usado dentro de funções async (ou em módulos ES). Ele pausa a execução da função assíncrona até que a Promise seja resolvida ou rejeitada. Se a Promise for rejeitada, o await lança uma exceção, que pode ser capturada com try/catch.
Para executar várias operações assíncronas em paralelo, não use await uma após a outra; em vez disso, crie as promises primeiro e depois use Promise.all para aguardar todas de uma vez. Isso reduz o tempo total de espera.
Neste card, você vai praticar a criação de funções async, o uso de await, o tratamento de erros com try/catch assíncrono e a execução paralela com Promise.all.
Pontos-chave
- Funções
asyncsempre retornam umaPromise. awaitsó pode ser usado dentro de funçõesasync(ou módulos ES).awaitpausa a função assíncrona até aPromiseresolver ou rejeitar.- Erros em
awaitsão capturados comtry/catch. - Use
Promise.allpara rodar promises em paralelo e aguardar todas.
// Simula uma operação assíncrona que leva 'ms' milissegundos
function delay(ms, valor) {
return new Promise((resolve) => setTimeout(() => resolve(valor), ms));
}
// Função assíncrona que busca dados de um usuário
async function buscarUsuario(id) {
console.log(`Buscando usuário ${id}...`);
const usuario = await delay(1000, { id, nome: 'Ana' });
return usuario;
}
// Função assíncrona que busca posts de um usuário
async function buscarPosts(id) {
console.log(`Buscando posts do usuário ${id}...`);
const posts = await delay(1500, ['Post 1', 'Post 2']);
return posts;
}
// Função principal assíncrona
async function main() {
try {
// Execução sequencial (um após o outro)
const usuario = await buscarUsuario(1);
const posts = await buscarPosts(1);
console.log('Sequencial:', usuario, posts);
// Execução paralela com Promise.all
const [usuario2, posts2] = await Promise.all([
buscarUsuario(2),
buscarPosts(2),
]);
console.log('Paralelo:', usuario2, posts2);
} catch (erro) {
console.error('Erro:', erro.message);
}
}
main();