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!