Generator

O objeto Generator é retornado por generator function e conforme iterable protocol e o iterator protocol.

Síntaxe

function* gen() { 
  yield 1;
  yield 2;
  yield 3;
}

var g = gen(); // "Generator { }"

Métodos

Generator.prototype.next()
Retorna o valor fornecido pela expressão yield.
Generator.prototype.return()
Retorna o valor fornecido a finaliza o generator.
Generator.prototype.throw()
Lança um erro no generator.

Example

An infinite iterator

function* idMaker(){
    var index = 0;
    while(true)
        yield index++;
}

var gen = idMaker(); // "Generator { }"

console.log(gen.next().value); // 0
console.log(gen.next().value); // 1
console.log(gen.next().value); // 2
// ...

Objeto legacy generator

Firefox (SpiderMonkey) também implementa a versão anterior do generator em JavaScript 1.7, onde o asterisco (*) na declaração da função não era necessário (somente era necessário usar a palavra reservada yield no corpo da função). Contudo, legacy generators estão obsoletos. Não os use, eles serão removidos (bug 1083482).

Métodos legacy generator

Generator.prototype.next()
Retorna o valor fornecido pela expressão yield. Isto corresponde ao next() do ES6.
Generator.prototype.close()
Fecha o generator, então quando chamar next() um erro StopIteration  será lançado. Isto corresponde ao  método return() do ES6.
Generator.prototype.send()
Usado para enviar um valor para o generator. Este valor é retordo pela expressão yield, e retorna o valor fornecido pelo pelo next yield. send(x) corresponde ao next(x) do ES6.
Generator.prototype.throw()
Lança um erro no generator. Isto corresponde ao método throw() do ES6.

Exemplo do Legacy generator

function* fibonacci() {
  var a = yield 1;
  yield a * 2;
}

var it = fibonacci();
console.log(it);          // "Generator {  }"
console.log(it.next());   // 1
console.log(it.send(10)); // 20
console.log(it.close());  // undefined
console.log(it.next());   // throws StopIteration (Como o generator está fechado)

Especificações

Especificações Status Comentário
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Generator objects' in that specification.
Padrão Definição Inicial
ECMAScript Latest Draft (ECMA-262)
The definition of 'Generator objects' in that specification.
Rascunho  

Compatibilidade nos navegadores

Estamos convertendo nossos dados de compatibilidade para o formato JSON. Esta tabela de compatibilidade ainda usa o formato antigo, pois ainda não convertemos os dados que ela contém. Descubra como você pode ajudar!

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support 39.0 (Yes) Não suportado Não suportado Não suportado
Feature Android Android Webview Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support Não suportado 39.0 (Yes) Não suportado Não suportado Não suportado 39.0

Veja Também

Legacy generators

ES6 generators