Esta tradução está incompleta. Por favor, ajude a traduzir este artigo.

Resumo

A declaração function* (palavra chave function seguida de um asterisco) define um função geradora (generator function).

Você também pode definir funções geradoras usando o construtor GeneratorFunction e uma expressão function*.

Sintaxe

function* name([param[, param[, ... param]]]) {
   statements
}
name
O nome da função.
param
O nome do argumento que será passado á função. Uma função pode ter até 255 argumentos.
statements
As instruções que formam o corpo da função.

Descrição

Geradores são funções cuja execução pode ser interrompida e posteriormente continuada. Seus contextos (de associações de variáveis) ficarão salvas entre as re-entradas.

Geradores em JavaScript -- especialmente quando combinados com Promises -- são uma ferramenta muito poderosa para programação assíncrona, por mitigarem -- se não eliminarem -- problemas com callbacks, como os Callback Hell e Inversão de Controle. Funções async são fundamentadas nisso.

Chamar uma função geradora não executa seu corpo imediatamente; ao invés disso um objeto iterator é retornado. Quando o método next() do objeto iterator é chamado, o corpo da função do gerador é executado até a primeira expressão yield, que especifica o valor a ser devolvido do iterator ou, com yield*, delega para outra função geradora. O método next() retorna um objeto com propriedade value contendo o valor rendido e uma propriedade booleana done indicando se o gerador rendeu seu último valor. Chamar o método next() com um argumento resumirá a execução da função geradora, substituindo a expressão yield onde a execução foi parada com o argumento de next().

Uma expressão return em um gerador, quando executada, fará o gerador estar terminado (i.e. a propriedade done do objeto retornado passará a verdadeira). Se um valor é retornado por return, será usado como a propriedade value do objeto retornado pelo gerador. Semelhantemente a uma expressão return, um erro lançado dentro do gerador o terminará -- a não ser que tratado no corpo do gerador. Quando um gerador estiver terminado, chamadas next subsequentes não executarão nenhum código do gerador, retornarão simplesmente um objeto da forma: {value: undefined, done: true}.

Exemplos

Exemplo simples

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

var gen = idMaker();

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

Exemplo com yield*

function* outroGerador(i) {
  yield i + 1;
  yield i + 2;
  yield i + 3;
}
function* gerador(i){
  yield i;
  yield* outroGerador(i);
  yield i + 10;
}

var gen = gerador(10);

console.log(gen.next().value); // 10
console.log(gen.next().value); // 11
console.log(gen.next().value); // 12
console.log(gen.next().value); // 13
console.log(gen.next().value); // 20

Especificações

Especificação Status Comentário
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'function*' in that specification.
Padrão Definição inicial.

Compatibilidade nos browsers

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!

Funcionalidade Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Suporte básico 39 26.0 (26.0) Não suportado 26 Não suportado
yield* (Yes) 27.0 (27.0) Não suportado 26 Não suportado
Objeto IteratorResult ao invés de throw (Yes) 29.0 (29.0) Não suportado (Yes) Não suportado
Funcionalidade Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Suporte básico (Yes) 26.0 (26.0) Não suportado Não suportado Não suportado
yield* (Yes) 27.0 (27.0) Não suportado Não suportado Não suportado
Objeto IteratorResult ao invés de throw ? 29.0 (29.0) Não suportado Não suportado Não suportado

Observações específicas para Firefox

Generators e iterators no Firefox versões anteriores a 26

Versões mais antigas do Firefox implementam uma versão antiga da proposta de generators. Na versão mais antiga, generators foram definidos a usarem uma palavra chave function (sem um asterísco) dentre outras diferenças.

O retorno do objeto IteratorResult ao invés de um throw

Iniciando com Gecko 29 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26), o generator finalizado não lança mais uma exceção TypeError "generator has already finished". Ao invés disso, ele retorna um objeto IteratorResult como por exemplo { value: undefined, done: true } (bug 958951).

Veja também

Etiquetas do documento e colaboradores

Última atualização por: marcusdacoregio,