S02 – Atividade de Aprendizagem: async/await em JavaScript
Visão Geral
Imagine que você está pedindo comida pela internet. Você clica em "pedir" e depois...espera. Não dá para fazer mais nada em relação a esse pedido até a comida chegar, certo? É mais ou menos assim que o código JavaScript síncrono tradicional se comporta ao lidar com tarefas demoradas como buscar dados. Você envia uma requisição e fica esperando uma resposta. É como esperar que sua comida seja entregue.
Mas e se você pudesse continuar fazendo outras coisas enquanto espera a comida chegar? É aí que entra o async/await. Ele permite que você escreva código que parece síncrono (como se você estivesse esperando a comida), mas, nos bastidores, é assíncrono (como se você estivesse realizando outras tarefas enquanto espera).
Nesta atividade de aprendizagem, você aprenderá sobre async e await e, em uma atividade de aprendizagem separada sobre a Fetch API, você praticará seu uso.
Preparação
Async/await é a maneira moderna de lidar com operações assíncronas. Permite que você escreva código
assíncrono que se parece e se comporta como código síncrono, o que facilita a leitura e manutenção.
Antes, os desenvolvedores usavam funções de retorno de chamada e promises para lidar com código assíncrono, mas
a abordagem com async/await é mais fácil de manter e a mais recomendada, e será a utilizada neste curso.
Promises
Async/await baseia-se em promises, então você precisa entender como as promises funcionam antes de começar a usar
async/await. Uma promise é um objeto que representa a conclusão (ou falha) futura de uma operação assíncrona e seu
valor resultante. Ao criar uma promise, você pode adicionar retornos de chamada para lidar com o sucesso ou a
falha dessa operação.
Aqui está um exemplo simples de uma promise:
const minhaPromise = new Promise((resolver, rejeitar) => {
const sucesso = true; // Simule sucesso ou falha
if (sucesso) {
resolver("A operação foi bem-sucedida!");
} else {
rejeitar("A operação falhou.");
}
});
Neste exemplo, é criada uma promise que simula uma operação assíncrona. Se a operação for bem-sucedida, a função
resolver será chamada com uma mensagem de sucesso. Se falhar, a função rejeitar será
chamada com uma mensagem de erro.
Para processar o resultado de uma promise, você pode usar os métodos .then() e
.catch():
minhaPromise
.then((resultado) => {
console.log(resultado); // Saída: "A operação foi bem-sucedida!"
})
.catch((erro) => {
console.error(erro); // Saída: "A operação falhou."
});
Neste exemplo, se a promise for resolvida com êxito, a respectiva mensagem será registrada no console. Se falhar, a mensagem de erro será registrada.
Async/Await
Agora, vamos ver como async/await pode simplificar esse processo. A palavra-chave async é usada para
definir uma função assíncrona, enquanto a palavra-chave await é usada para pausar a execução dessa
função até que uma promise seja resolvida ou rejeitada.
Veja como você pode reescrever o exemplo anterior usando async/await:
const minhaFuncaoAsync = async() => {
try {
const resultado = await minhaPromise; // Aguarde a resolução da promise
console.log(resultado); // Saída: "A operação foi bem-sucedida!"
} catch (erro) {
console.error(erro); // Saída: "A operação falhou."
}
};
Neste exemplo, minhaFuncaoAsync é definida como uma função assíncrona usando a palavra-chave
async. Dentro da função, a palavra-chave await é usada para pausar a execução até que
minhaPromise seja resolvido ou rejeitado. Se a promise for resolvida com êxito, o resultado será
registrado no console. Se falhar, o erro também será detectado e registrado no console.
Async/await faz com que seu código pareça mais com código síncrono, facilitando a leitura e o entendimento. Isso também ajuda a evitar o "callback infierno", em que retornos de chamada aninhados deixam seu código confuso e difícil de acompanhar.
Aqui está um exemplo simples de uso de async/await para buscar dados de uma API:
const buscarDados = async() => {
try {
const resposta = await fetch("https://jsonplaceholder.typicode.com/posts/1"); // Aguarde a conclusão da busca
const dados = await resposta.json(); // Aguarde a conversão da resposta para JSON
console.log(dados); // Exiba os dados buscados
} catch (erro) {
console.error("Erro ao buscar dados:", erro); // Processamento de erros
}
};
Neste exemplo, a função buscarDados é definida como uma função assíncrona. Dentro da função, a
palavra-chave await é usada para pausar a execução até que a requisição de busca seja concluída e a
resposta seja convertida em JSON. Se ocorrerem erros durante esse processo, eles serão detectados e registrados.
Async/await é um recurso poderoso para lidar com operações assíncronas em JavaScript. Ele permite que você escreva código mais organizado e fácil de ler, sem perder as vantagens da programação assíncrona.
Atividade de Aprendizagem
Você terá a oportunidade de usar async/await na próxima atividade de aprendizagem (Fetch
API), em que você buscará dados de profetas dos últimos dias de um arquivo JSON e os
processará para criar uma página assim que os dados estiverem disponíveis.
Recursos Opcionais
- JavaScript Assíncrono – MDN
- Funções Assíncronas – MDN
- await – MDN
- Bloco try...catch – MDN