Continuando então com o último artigo da minissérie sobre JavaScript Assíncrono , vamos entender o conceito de Async/Await!

O que é o Async?

Lembra das Promises que vimos no primeiro artigo dessa minissérie? O async/await veio para tornar o uso das Promises mais legível, mais elegante por assim dizer. Basicamente, usando async/await, você tem um código assíncrono que é escrito como se fosse síncrono, o que é muito mais familiar!

O async é uma palavra reservada que colocamos na frente de uma função para transformá-la numa função assíncrona. E qual a diferença entre uma função normal e uma função assíncrona? Uma função assíncrona, também chamada de async function, vai retornar uma Promise. Dessa maneira:

function saudacao() { //Nada demais, a invocação normal de uma função...
    return "Oi!"
}
console.log(saudacao()) //imprime "Oi!"

async function saudacaoAsync() { //... mas usando o async, tem diferença!
    return "Oi!"
}
console.log(saudacaoAsync()) //imprime Promise { 'Oi!' }

Também podemos usar o async com arrow functions, assim:

let ola = async () => { return "Olá!" };

Para de fato imprimir o resultado, visto que retorna uma Promise, precisaríamos usar um then:

saudacaoAsync().then(console.log)

Sendo assim, podemos perceber que usamos a palavra reservada async quando queremos retornar uma Promise, e não o valor armazenado dentro de uma função.

E o Await?

Podemos usar o await antes de quaisquer expressões que retornem promises, de modo que o código vai esperar ou aguardar até que essa promessa seja resolvida, para então continuar a execução. Assim:

//refatorando a função anterior, usando o async e o await

async function saudacaoAsync() {
    return saudacao = await Promise.resolve("Oi!")
}
saudacaoAsync().then(console.log) //imprime Oi!

Lembrando ainda que só podemos usar o await em funções declaradas com o async.

Usamos o async/await para tornar um código assíncrono, de uma forma mais elegante e legível do que as Promises. Ou seja, qualquer código escrito com Promises, usando then e tudo, pode ser reescrito com async/await!

Isso não torna seu uso obrigatório, é apenas mais uma maneira de fazer uma mesma coisa. Você pode usar qualquer um que se sinta mais familiarizado.

O then() então tem o mesmo funcionamento que o async/await?

Não! Não é possível comparar os dois, pois possuem funcionamentos lógicos diferentes. Ao usarmos o then, as Promises são executadas em paralelo, enquanto o async/await trata as Promises de forma sequencial, como se estivesse realmente executando um código síncrono – que imprime os resultados um após o outro, como vimos no artigo sobre Promises – mas, de maneira assíncrona.

Além disso, o async/await só funciona com uma Promise de cada vez, enquanto, em contrapartida, é possível encadear a execução de vários then. Também, por fazer as execuções em paralelo, a solução usando then acaba sendo mais rápida do que a solução usando async/await.

Esse comportamento é benéfico quando se pensa numa situação em que será necessário acessar vários registros, mas não se quer fazê-lo em paralelo, o que poderia significar uma demora nos resultados e até a queda do sistema. Dessa maneira, pode-se usar o async/await, que vai executar uma Promise por vez e não pesará tanto no desempenho do programa.

Conclusão

E com este concluímos a minissérie de artigos sobre JavaScript Assíncrono! No primeiro artigo da série tratamos de programação síncrona e assíncrona e o uso de Promises; no segundo, falamos sobre as callbacks e sua utilidade no ramo das promises e diversos outros usos na linguagem JavaScript.

Bons estudos!