quinta-feira, 21 de abril de 2016

Generators no JavaScript ES6 (ECMAScript 6)

Generators são um tipo especial de função, também conhecidos como iteradores. Estas funções são responsáveis pela geração de uma sequencia de valores, como um array, porém, elas não produzem um array contendo todos os elementos da sequencia e retornam o mesmo, ao invés disto, é produzido um elemento da sequencia a cada vez que estas funções são chamadas. Os elementos podem ser gerados indefinidamente sem que haja necessidade de alocação de memória para esta sequencia, já que a mesma não é um array.

Em JavaScript os generators retornam um objeto do tipo Generator. Este objeto possui um método chamado next() que retorna um objeto contendo as propriedades done e value.

  • done = true indica que o iterador já chegou ao fim da sequencia a ser iterada, done = false indica que ha mais valores a serem produzidos na sequencia.
  • value é o valor retornado pelo iterador. 

O generator possui uma expressão yield, que quando atingida, retorna o novo valor do generator e pausa a execução da função. Então, da próxima vez que next() é chamado o fluxo continua a partir da chamada de yield até que não haja mais um valor para retornar. O estado da função é mantido a cada chamada.

Um generator é caracterizado pelo asterisco após a palavra chave function e pelo uso da expressão yield.

Neste exemplo criaremos um generator que gera a sequencia de fibonacci.


function* fibonacci() {
   var a = 0;
   var b = 1;
   yield a;
   yield b;
   while(true) {
     var f = a + b;
     a = b;
     b = f;
     yield f;
  }
}

var generator = fibonacci();
generator.next(); // {value: 0, done: false}
generator.next(); // {value: 1, done: false}
generator.next(); // {value: 1, done: false}
generator.next(); // {value: 2, done: false}
generator.next(); // {value: 3, done: false}
generator.next(); // {value: 5, done: false}
generator.next(); // {value: 8, done: false}
generator.next(); // {value: 13, done: false}
.......
.......

Espero que este post tenha sido útil.
Abraço

Nenhum comentário:

Postar um comentário