NodeJs — Async/Await

Andre Baltieri
balta.io
Published in
3 min readMay 23, 2017
Só um momento Sr, enquanto localizo seu cadastro…

Quem trabalha com JavaScript sabe que tem horas que bate um desespero em ver aquele código bagunçado, fruto dos Callbacks e Promises que temos como padrão da linguagem.

Pois bem, nas novas especificações do EcmaScript e já implementado na versão 7.x do NodeJs, estão o Async/Await, dois caras que vão deixar nosso código lindo! Mas antes, vamos entender um pouco mais sobre como as coisas funcionam!

Tudo é assíncrono

No JavaScript tudo é assíncrono por padrão. Por exemplo, ao chamar duas funções (funcaoUm() e funcaoDois()), o JS não aguarda a função terminar sua execução. Ele basicamente vai seguindo adiante.

Funções

O resultado do código acima por exemplo, onde chamamos primeiro a funcaoUm e depois a funcaoDois, será o seguinte:

Dois
Um

Isto ocorre por que as funções são disparadas na ordem, porém, o JS não aguarda a finalização das suas execuções, e como a segunda função retorna mais rápido que a primeira, elas se invertem!

Dependendo de um resultado de uma função

Mas e quando precisamos esperar o resultado de uma função? A solução para este caso são as Promises ou promessas.

Sempre que temos uma promessa, nunca temos o resultado imediato, e sim um Callback, ou seja, após a função terminar, ela chamará outra função ou retornará uma informação.

Pense nas Promises como as filas de atendimento de certos estabelecimentos, onde você chega, e ao invés de ser atendido, recebe uma senha para ser chamado depois.

Vamos alterar nosso código então para:

Vamos começar pela criação da promessa, na linha 11, onde temos como resultado dois parâmetros, resolve e reject, que serão utilizados para os casos de sucesso e erro na execução da promessa.

Dentro da promessa temos então nosso setTimeout, como tinhamos antes, e o que mudou por aqui?

Se notarmos, na linha 4, quando chamamos a funcaoUm, agora temos uma mudança significativa. Só chamamos a funcaoDois quando a funcaoUm termina.

Como na funcaoUm retornamos uma promessa, podemos agora utilizar o then() (Que significa então) que é executado após a promessa ser resolvida. Note também quem ao invés de utilizarmos um console.log(um) na funcaoUm, utilizamos o resolve(“Um”), isto retorna a string “Um” para quem estava esperando o retorno da promessa.

Então, na linha 4, quando a promessa é resolvida (then), temos um objeto como retorno (data “Um”) e exibimos ele na tela na linha 5.

O problema das Promises

Mas qual o problema das promessas então? O que chamamos de Promise Hell (Lembram do Callback Hell?)! Imagina que você precisa encadear várias funções e uma depende da outra. Dá uma olhada neste código:

Hadoukennnnnnn!!!

Até existe um meio de amenizar isto, inlcusive podemos utilizar outras libs como Bluebird para promessificar tudo, mas hoje vou mostrar algo diferente, o Async/Await.

Async/Await

Copiado do C# (Brincadeirinha, mas com fundo de verdade), o Async/Await permite que aguardemos as chamadas a métodos assíncronos antes de prosseguir.

Exemplo com async/await

Como podemos ver no código acima, podemos decorar nossas funções com o prefixo async, e toda função async pode ser esperada (await), como podemos ver nas linhas 4, 5 e 6.

Podemos utilizar o async/await para acesso ao banco de dados, trabalhos com arrays, funções e diversas outras coisas, não se prenda somente a este exemplo.

Se notarmos, na linha 29 ainda temos o uso de Promises, afinal elas não estão descartadas. Podemos utilizar e resolver uma promessa dentro de um método async, e ao invés de retornar um callback, retornamos o resultado.

Conclusão

Como é bom sair da bagunça que os Callbacks fazem no nosso código. Eu tenho usado e abusado do Async/Await nas minhas APIs com Node, e você? O que acha dessas mudanças? Comenta aí!

Curso de NodeJs

Gostou do Async/Await? Quer aprender a utilizar ele em cenários reais, com Mongoose/MongoDb, com Express e APIs de alta performance? Então não perca meu curso online e ao vivo de Node.

Na compra do curso você ainda ganha uma assinatura de 6 meses do site balta.io onde terá acesso à mais de 80 outros cursos. Corram pois as vagas são limitadas!

INSCREVA-SE JÁ

--

--