Generator

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

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

js
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 (Erro do Firefox 1083482).

Métodos legacy generator

Generator.prototype.next() Non-standard

Retorna o valor fornecido pela expressão yield. Isto corresponde ao next() do ES6.

Generator.prototype.close() Non-standard

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() Non-standard

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() Non-standard

Lança um erro no generator. Isto corresponde ao método throw() do ES6.

Exemplo do Legacy generator

js
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

Specification
ECMAScript Language Specification
# sec-generator-objects

Compatibilidade com navegadores

BCD tables only load in the browser

Veja Também

Legacy generators

ES6 generators