Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

async await

Bom dia. A professora falou que colocamos o await para avisar o JS que ele precisa esperar o codigo fazer o que a linha x pede, para poder continuar a executar a função, correto? Mas o JS não faz isso automaticamente? Ele não executa linha por linha e só passa pra proxima linha quando consegue "executar" a linha anterior?

1 resposta
solução!

Boa noite Marcos, tudo certo?

Você trouxe um ótimo questionamento. Eu vou tentar explicar de outra forma e trazer algumas referências que podem ser interessantes:

O JavaScript em si realmente realiza as tarefas sequencialmente, linha a linha, como você mencionou. Porém, os sistemas conectados que utilizamos e desenvolvemos hoje têm muitos elementos que se comportam de forma assíncrona. Por exemplo: se você pede para outro programa abrir um arquivo de texto e retornar uma informação isso vai levar tempo. Como podemos saber quanto tempo vai levar para esse programa nos trazer a resposta? Veja o seguinte código de exemplo:

function imprimeRelatorio() {
    let dados = leArquivo("arquivoMuitoGrande.txt");
    // Considerando que a função leArquivo retorna uma Promise

    console.log(dados);
}

Ao chamar imprimeRelatorio(), pode ser que antes da função leArquivo devolver a resolução da Promise, seja chamado a linha do console.log. Mas, e aí, se o dado não foi lido e retornado ainda? O que acontece?

Nós poderíamos colocar um delay para esperar que o arquivo todo seja lido e só então mostrar o relatório:

function imprimeRelatorio() {
    let dados = leArquivo("arquivoMuitoGrande.txt");

    espera10segundos();

    console.log(dados);
}

Mas agora temos outro problema: o relatório vai demorar 10 segundos para sair, mesmo se mudarmos o dado para uma base menor. Ou até mesmo o nosso maior arquivo não demore tanto, ou tenhamos arquivos que demorem 30 segundos. Enfim, diversos problemas surgem ao tentar estimar o tempo de espera para que algumas instruções sejam concluídas.

E é para essa finalidade que criaram a sintaxe async await, para que o programa espere essa Promise ser resolvida sem precisar alterar muito o nosso código. Basta avisar que a função é assíncrona e qual comando iria bloquear o nosso processo para esperarmos por ele:

function async imprimeRelatorio() {
    let dados = await leArquivo("arquivoMuitoGrandeGigantesco.txt");

    // Agora quando formos mostrar na tela, teremos certeza de que o arquivo foi lido

    console.log(dados);
}

Caso ainda tenham restado algumas dúvidas saiba que é completamente normal e que podemos levar um tempo para internalizar os conteúdos. Você compartilhar sua concepção aqui no fórum é uma atitude muito positiva para reforçar o conhecimento. Aqui eu reuni algumas outras fontes que recomendo a leitura:

Espero ter ajudado. Continue assim e bons estudos!