Lógica de programação

Promessas e Async/Await

As promessas e o uso de async/await são ferramentas fundamentais em JavaScript para lidar com operações assíncronas. Embora frequentemente sejam mencionados juntos, eles têm propósitos diferentes e são usados em contextos específicos. As promessas são objetos que representam resultados que ainda não estão disponíveis, permitindo que os desenvolvedores escrevam código que seja mais conciso e fácil de manter. Já o uso de async/await permite que os desenvolvedores escrevam código que pareça ser síncrono, mas que na verdade é assíncrono, tornando-o mais fácil de entender e usar. Um exemplo prático da diferença entre as duas ferramentas pode ser observado em um cenário onde um usuário precisa realizar uma solicitação a um servidor para carregar dados. Com promessas, o código seria escrito de forma a capturar o resultado da solicitação, seja ele sucesso ou falha, e manipulá-lo posteriormente. Já com async/await, o código seria escrito de forma a parecer que a operação está sendo executada de forma síncrona, mas na verdade é assíncrona, tornando-o mais fácil de entender e usar. A escolha entre as duas ferramentas depende do contexto em que ela será usada. As promessas são mais úteis quando se precisa lidar com múltiplas operações assíncronas ao mesmo tempo, enquanto o uso de async/await é mais adequado para cenários onde a operação assíncrona é simples e fácil de entender.

O que são Promessas?

Uma promessa é um objeto que representa o resultado de uma operação assíncrona. Ela pode estar em três estados: pendente (pending), cumprida (fulfilled) ou rejeitada (rejected). Quando você cria uma promessa, ela começa no estado pendente e muda para cumprida quando a operação é concluída com sucesso, ou para rejeitada se ocorrer algum erro. Uma das principais vantagens de utilizar promessas é que elas permitem escrever código assíncrono de forma mais concisa e limpa. Por exemplo, imagine que você está fazendo uma requisição HTTP a um servidor remoto para obter dados. Em vez de bloquear o fluxo do seu programa até que a resposta seja recebida, você pode criar uma promessa e usar o método then() para especificar o código a ser executado quando a operação for concluída com sucesso. Isso permite que seu programa continue rodando enquanto espera pela resposta do servidor. Com as promessas, também é possível tratar os erros de forma mais elegante, usando o método catch().

O que são Async/Await?

Async/await é uma sintaxe de JavaScript que permite escrever código assíncrono de forma mais linear e fácil de entender. Isso significa que você pode evitar a confusão causada pelo uso excessivo do método .then() para lidar com a resposta de uma promessa, tornando o seu código mais legível e manutenível. Com async/await, você pode usar o operador await dentro de uma função async para aguardar o resultado da operação, sem precisar preocupar-se com os callbacks ou as cadeias de .then(). Por exemplo, imagine que você está fazendo uma requisição HTTP para um servidor remoto para obter alguns dados. Com a sintaxe tradicional, você precisaria usar something como `fetch('https://example.com/dados') .then(response => response.json()) .then(dados => console.log(dados))`. Já com async/await, você pode simplesmente escrever uma função assim: `async function obterDados() { const resposta = await fetch('https://example.com/dados'); const dados = await resposta.json(); console.log(dados); }`. Observe como a sintaxe é mais clara e fácil de entender? Isso é apenas um exemplo simples, mas você pode imaginar como isso se aplica em cenários mais complexos.

Uma Exemplo

Quando se trabalha com operações assíncronas em uma API, é comum precisar aguardar o resultado de uma requisição para continuar a execução do código. Nesse caso, podemos usar promessas ou async/await para representar e gerenciar essas operações. Vamos considerar um exemplo simples: suponha que você esteja criando uma API que retorna os dados de um usuário com o ID 1. Você pode usar uma promessa para representar a operação assíncrona, passando a função que irá recuperar os dados do usuário como callback. Por outro lado, pode-se utilizar async/await, definindo uma função assimétrica (async) que contém a lógica da requisição e espera o resultado com await. Com essa abordagem, você não precisa preocupar-se em lidar com callbacks ou chamar funções de forma explícita para aguardar o término das operações.

  • Crie uma função que retorne uma promessa
  • Use o método .then() ou async/await para lidar com a resposta da promessa

Diferenças entre Promessas e Async/Await

As principais diferenças entre a utilização de Promessas e async/await na programação assíncrona estão relacionadas à forma como o desenvolvedor lida com operações que demoram tempo para serem concluídas. As Promessas permitem que você escreva código mais flexível, pois permite que várias tarefas sejam executadas em paralelo e seja possível manipular a execução de cada uma delas. Por exemplo, ao lidar com requisições HTTP, as promessas podem ser utilizadas para tratar os erros da resposta do servidor antes de tentar realizar outra coisa que depende dessa resposta, tornando o código mais robusto e resiliente. No entanto, essa flexibilidade pode vir a complicar a manutenção e compreensão do código, pois as Promessas exigem um conhecimento mais profundo sobre como elas são tratadas e como lidar com os possíveis erros que podem ocorrer ao longo da execução. Além disso, em alguns casos, pode ser necessário utilizar recursos adicionais para facilitar a compreensão do fluxo de execução, o que pode aumentar ainda mais a complexidade do código. Por outro lado, a sintaxe async/await permite uma forma mais concisa e fácil de lidar com operações assíncronas, tornando o código mais fácil de entender e manter. Com essa abordagem, você pode utilizar expressões como "await" para pausar a execução do código até que a operação assíncrona seja concluída, sem precisar lidar com as Promessas explícitamente. Isso torna o código mais fácil de ser lido e compreendido por outros desenvolvedores.

  • Promessas: mais flexíveis, mas podem tornar o código mais complexo
  • Async/Await: mais lineares e fáceis de entender, mas limitadas em termos de flexibilidade

Conclusão

Em resumo, as promessas e async/await são ferramentas poderosas para lidar com operações assíncronas em JavaScript. Enquanto as promessas oferecem mais flexibilidade, o uso de async/await pode tornar o código mais fácil de entender e manter. Com a sintaxe async/await, você pode escrever códigos que parecem ser síncronos, mas que na verdade são executados assincronamente. Isso é especialmente útil em situações onde precisamos aguardar por uma resposta de um servidor ou realizar operações complexas que demoram tempo para serem concluídas. Por exemplo, imagine que você está construindo um aplicativo web e precisa carregar dados de um banco de dados remoto. Com a sintaxe async/await, você pode escrever código como: ```javascript async function carregarDados() { const resposta = await fetch('https://exemplo.com/dados'); const dados = await resposta.json(); return dados; } ``` Essa abordagem torna o código muito mais fácil de entender e manter, pois evita a necessidade de usar callbacks ou manipulação explícita das promessas. Além disso, async/await permite que você use um estilo de programação mais linear, sem precisar lidar com os detalhes complexos da execução assíncrona. As promessas, por outro lado, oferecem uma maior flexibilidade e permitem manipulação explícita das operações assíncronas. Elas são especialmente úteis em situações onde é necessário tratar de maneira específica as possíveis respostas do servidor ou realizar operações que dependem da execução de outras tarefas. Em resumo, tanto as promessas quanto a sintaxe async/await são ferramentas poderosas para lidar com operações assíncronas em JavaScript. A escolha entre elas depende das necessidades específicas do seu projeto e do estilo de programação que você prefere usar.

Curtiu? A trilha gamificada de fundamentos do TrilhaDev é grátis.

Criar conta grátis

Perguntas frequentes

Posso usar ambas as técnicas juntas?

Sim, é comum usar promessas para representar operações assíncronas e async/await para lidar com a resposta.

O que acontece se uma promessa falhar?

Se uma promessa for rejeitada (rejected), você pode usar o método .catch() ou try/catch para lidar com o erro.

Como posso saber quando uma promessa está concluída?

Você pode verificar o estado da promessa usando métodos como isResolved() ou isRejected().