O que é async/await e como funciona?

Nas lições anteriores, você aprendeu sobre programação assíncrona que permite que outro código seja executado enquanto esperamos que algumas tarefas demoradas sejam concluídas, como buscar dados de um servidor, ler dados de um arquivo e assim por diante. async/await, construído sobre promises, facilita a escrita e a leitura de código assíncrono. Quando você coloca a palavra-chave async antes de uma função, isso significa que essa função sempre retornará uma Promise. A palavra-chave await, que permite esperar que uma Promise seja resolvida antes de passar para a próxima linha de código, só pode ser usada dentro de funções assíncronas ou nos corpos de nível superior de módulos. Aqui está um exemplo para ilustrar como async/await funciona:
async function delayedGreeting(name) {
  console.log("A Messenger entered the chat...");
  await new Promise(resolve => setTimeout(resolve, 2000));
  console.log(Hello, ${name}!);
}

delayedGreeting("Alice");
console.log("First Printed Message!");
Neste código, definimos uma função async chamada delayedGreeting. Dentro desta função, usamos await para pausar a execução por 2 segundos. Após o atraso, ele imprime uma saudação. Quando chamamos esta função, você verá First Printed Message! aparecer antes da saudação. Isso ocorre porque a função é assíncrona - ela não bloqueia o restante do código de ser executado. Uma das maiores vantagens do async/await é o tratamento de erros. Com promises, frequentemente tínhamos que usar o método .catch() para tratar erros. Com async/await, podemos usar blocos try/catch. Aqui está um exemplo:
async function fetchUserData() {
  try {
    let response = await fetch(https://api.example.com/users);
    let userData = await response.json();
    console.log(userData);
  } catch (error) {
    console.log("Error fetching user data:", error);
  }
}

fetchUserData();
Neste exemplo, estamos usando async/await para buscar dados do usuário de uma API. A palavra-chave await é usada duas vezes: uma para esperar a conclusão da operação fetch e outra para esperar o término do parsing JSON. Se ocorrer algum erro durante este processo, ele será capturado no bloco catch.
Este módulo não possui perguntas. Marque como concluído.