NodeJs — Async/Await
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.
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:
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.
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!