Da trilha de JavaScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

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 async sempre retornam uma Promise.
  • await só pode ser usado dentro de funções async (ou módulos ES).
  • await pausa a função assíncrona até a Promise resolver ou rejeitar.
  • Erros em await são capturados com try/catch.
  • Use Promise.all para rodar promises em paralelo e aguardar todas.
async_await.js
// 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();

Exercícios

  1. 1
    Fácil

    Saudação assíncrona

    Crie uma função async chamada saudar que recebe um nome e retorna a string Olá, <nome>!. Use await para esperar 500ms antes de retornar, simulando uma operação assíncrona. Depois, chame a função e imprima o resultado.

    Resolver
  2. 2
    Médio

    Tratamento de erro assíncrono

    Crie uma função async chamada dividir que recebe dois números e retorna a divisão do primeiro pelo segundo. Se o segundo número for zero, a função deve lançar um erro com a mensagem Divisão por zero não permitida. Chame a função com (10, 2) e (10, 0), tratando os erros com try/catch e imprimindo o resultado ou a mensagem de erro.

    Resolver
  3. 3
    Desafio

    Execução paralela com Promise.all

    Crie três funções assíncronas: buscarUsuario, buscarPosts e buscarComentarios, cada uma recebendo um id e retornando dados após um atraso específico (1000ms, 1500ms e 2000ms, respectivamente). Use Promise.all para buscar todos os dados em paralelo para o id 1 e imprimir o tempo total decorrido. Em seguida, faça o mesmo de forma sequencial (um após o outro) e compare os tempos. Trate possíveis erros com try/catch.

    Resolver

Continue estudando