O Poder dos Generators, Iterators e Async Iteratorns no JavaScript
Tipos de dados avançados que te salva na hora de processar grandes dados!
Você já se encontrou numa situação onde precisava processar um volume intenso de dados porém ficava na preocupação quanto a carga exessiva de memória para lidar com grande número de arrays?
No JavaScript temos o Generator por exemplo que pode te ser útil para gerar os elementos do array de forma dinâmica, em vez de criá-lo inteiramente de uma vez.
Massa né? Venha ver como aplicar não apenas Generator mas outros dados avanaçados com JS:
Analisando o código core do Node.js
Analisando o projeto do Node.js é possível encontrar dentro da ásta fs.dir um exemplo belo de async iterators:
Este código faz parte do módulo fs
no Node.js e tem como objetivo implementar a leitura de diretórios de forma assíncrona usando Generators, Async Iterators e Promises.
A função
entries()
é um método assíncrono da classeDir
que retorna um Async Iterator usando um Generator.O Generator é usado para iterar de forma assíncrona sobre os itens desse mesmo diretório.
Um loop
while (true)
é utilizado para continuar a leitura até quenull
seja retornado, indicando o fim do diretório.
É belissímo ver certas implementações no core do Node.js, é um exercicío que indico bastante você fazer 😬
Vamos a prática 🤓
Os códigos abaixo que eu vou te mostrar estão por completo nesse repositóriod o github → https://github.com/ananeridev/advanced-data-types-js
Entendendo o Generator Simples
No exemplo abaixo temos o um código que começa com a definição de um Generator chamado calculation
que aceita dois argumentos e retorna o resultado da multiplicação deles.
Em seguida, há um Generator principal chamado main
que emite algumas strings e delega para o Generator calculation
.
Essa simples função será usada a frente para que eu consiga simular um calculo dentro de um retorno yield
Inicializando e Utilizando de fato o Generator
O Generator principal main
é inicializado, criando um objeto generator
.
O método next()
é então chamado para obter o próximo valor gerado.
Os resultados são impressos no console para demonstrar o progresso da execução e cada vez que insiro mais console.log com o next ele irá executar em cascata até retornar undefiend e não ter nenhum valor para retornar
O retorno dessa execução:
Como validar se está tudo certo? Testando!
A adição de testes de unidade eu realizo até pra simples exemplos, nesse caso não foi diferente.
Inclui aqui asserções para validar se os valores gerados estão corretos. Isso ajuda a garantir que o Generator esteja produzindo os resultados esperados.
Explorando Outras Formas de Utilizar o Generator
Aqui existem outros diferentes formas de consumir os valores do Generator, como usando Array.from
e o operador de spread. Ambos produzem arrays com os valores gerados:
O retorno dessa linha será:
Adicionando o rest spread
O retorno dessa linha será:
Async Iterators
Indo mais além podemos utilizar async iterators que é onde o Generator promisified
gera promessas e o Generator systemInfo
gera informações do sistema de forma assíncrona usando operações de sistema de arquivos.
Seguindo o mesmo exemplo dos anteriores:
O retorno será
Loucura demais que nos traz todos os buffers de um array!!
Utilizando Async Iterators com for await...of
Para finalizar vamos usar um exemplo de como consumir Async Iterators usando for await...of
, onde as informações do sistema são exibidas no console.
Aqui eu crio um função async simples onde busco informações do file, tamanho do file e o diretório por si só:
O retorno fica bem bacana onde insere gradualmente dentro de size, dir e file conforme vamos adicionando mais informações, segue exemplo do útimo retorno com o yield { dir }
Por fim 😮💨
Apesar de não parecer, é bem simples o entendimento, devemos sempre explorar ao máximo as funcionalidade que as ferramentas que usamos como linguagem podem no proporcionar.
E foi como disse na introdução, consumo exessivo de dados, pede cautela no momento de codificar, arrays podem causar estragos se não bem manipulados!
Dicas da semana 🔥
[CURSO] - Como eu mostrei não basta apenas fazer exemplos, precisamos TESTAR DE FATO! Se você tem dificuldade ou quer se especializar um testes automatizados, tenho indiação de um curso fodástico para você → SE VOCÊ QUER MUDAR COMO TESTA SE CÓDIGO, CLICA AQUI!
☕️ [CAFÉ] - Se você gosta de tomar aquele cafézinho com código, eu te apresento a Veroo cafés, com meu cupom: ANANERI você garante um café por assinatura artesanal por mês
👩💻 [RECEBER DO EXTERIOR COM POUCAS TAXAS] - Galera, a Husky é a mais nova patrocinadora da news e com meu link você consegue criar uma conta gratuita pra receber seus pagamentos fora do Brasil!