4
respostas

Duvida sobre funcao async

Bom dia.

Fiz a formacao "Aprenda a programar em JS com foco no back-end", aprendi sobre funções assincronas, porém ainda fiquei com uma dúvida.

Na aula, criamos a função assincrona para se conectar ao BD. Pelo que entendi, sempre que uma funcao que pode demorar ou gerar erros, tipo conexoes com bds, aberturas de arquivos, etc, sao assincronas para nao "travar" a execucao do código.

Porém, no arquivo app.js, ao chamar essa funcao assincrona, ela é chamada utilizando await. Sei que se nao usar o await na chamada a funcao async sempre retorna uma promisse, correto? E ao utilizar o await na chamada da funcao assincrona estou dizendo ao JS para só continuar a execucao do codigo após ter o retorno da funcao (nao a promisse), afinal, preciso da conexao ao bd para seguir adiante, correto?

Minha dúvida é a seguinte: por que devo criar a funcao de conexao ao bd de forma assincrona (para resto do codigo continuar executando), se quando vou chamá-la utilizo o await para "travar o codigo" ate ter seu retorno?

Fiquei com essa duvida, talvez esteja pensando errado em algo.

Obrigado!

4 respostas

Olá, Thiago.

Tudo bem?

Você está correto ao entender que funções assíncronas são usadas para evitar que operações demoradas, como conexões com bancos de dados ou leituras de arquivos, bloqueiem a execução do restante do código. No entanto, a utilização de await na chamada dessas funções pode parecer contraditória à primeira vista, mas tem uma razão importante.

Vamos por partes:

  1. Funções Assíncronas e Promises:

    • Quando você cria uma função assíncrona com async, ela sempre retorna uma Promise. Isso permite que você use await para esperar a resolução dessa Promise.
    • Exemplo:
      async function conectaNaDatabase() {
        // Simulação de uma operação assíncrona
        return new Promise((resolve) => setTimeout(() => resolve("Conectado!"), 1000));
      }
      
  2. Uso do await:

    • O await é usado para esperar que a Promise seja resolvida antes de continuar a execução do código. Isso é útil quando você precisa do resultado da operação assíncrona para continuar.
    • Exemplo:
      async function main() {
        const resultado = await conectaNaDatabase();
        console.log(resultado); // "Conectado!"
        // Código que depende da conexão ao banco de dados
      }
      main();
      
  3. Por que usar await se a função é assíncrona?:

    • Mesmo que a função assíncrona seja criada para não bloquear o loop de eventos, em certos pontos do código você precisa garantir que uma operação crucial (como a conexão ao banco de dados) esteja completa antes de prosseguir. Isso é essencial para evitar erros ou comportamentos inesperados.
    • No seu caso, ao conectar-se ao banco de dados, você precisa garantir que a conexão esteja estabelecida antes de executar operações que dependem dessa conexão.
  4. Exemplo Prático:

    • Imagine que você tem uma API que precisa se conectar ao banco de dados antes de iniciar o servidor:
      import express from "express";
      import conectaNaDatabase from "./config/dbConnect.js";
      
      const app = express();
      
      async function startServer() {
        try {
          const conexao = await conectaNaDatabase();
          console.log("Conexão com o banco feita com sucesso");
      
          // Iniciar o servidor somente após a conexão ser bem-sucedida
          app.listen(3000, () => {
            console.log("Servidor escutando na porta 3000");
          });
        } catch (erro) {
          console.error("Erro ao conectar ao banco de dados:", erro);
        }
      }
      
      startServer();
      

Neste exemplo, o servidor só começa a escutar na porta 3000 depois que a conexão com o banco de dados é estabelecida com sucesso. Se a conexão falhar, o servidor nem sequer inicia, evitando problemas mais complexos.

Espero ter ajudado e bons estudos!

Oi Renan! muito obrigado pela resposta.

Nesse caso já que preciso esperar o resultado utilizando o await, seria a mesma coisa usar uma função síncrona normal? Pq aí o js tbm esperaria o retorno da funcao, não é? Qual seria a diferença de usar função async ou síncrona nesse caso?

obrigado!

Olá, Thiago!

A diferença entre funções síncronas e assíncronas com await é que funções síncronas bloqueiam todo o código até terminarem, enquanto funções assíncronas permitem que outras partes do código continuem rodando.

Quando você usa await, o código "pausa" apenas o trecho necessário, mas o resto da aplicação pode continuar executando outras tarefas. Isso é crucial em servidores, onde múltiplas requisições podem chegar ao mesmo tempo. Usar funções assíncronas melhora o desempenho e a responsividade da aplicação, evitando travamentos desnecessários.

Espero ter esclarecido! Abraço!

Agora entendi! muito obrigado renan!