We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Tradução em progresso.

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 quand combinados com Promises -- são uma ferramenta muito poderosa para programação assíncrona, por mitigarem -- se não eliminiam -- 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

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

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

Colaboradores desta página: GabrielBarbosaGV, SphinxKnight, cezaraugusto, AlanCezarAraujo
Última atualização por: GabrielBarbosaGV,