Neste tutorial, você aprenderá sobre geradores de JavaScript com a ajuda de exemplos.
Em JavaScript, os geradores fornecem uma nova maneira de trabalhar com funções e iteradores.
Usando um gerador,
- você pode parar a execução de uma função de qualquer lugar dentro da função
- e continuar executando o código de uma posição interrompida
Crie geradores de JavaScript
Para criar um gerador, você precisa primeiro definir uma função de gerador com function*
símbolo. Os objetos de funções geradoras são chamados de geradores.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Nota : A função do gerador é denotada por *
. Você pode usar function* generatorFunc() (… )
ou function *generatorFunc()(… )
para criá-los.
Usando o rendimento para pausar a execução
Conforme mencionado acima, você pode pausar a execução de uma função do gerador sem executar todo o corpo da função. Para isso, usamos a yield
palavra - chave. Por exemplo,
// generator function function* generatorFunc() ( console.log("1. code before the first yield"); yield 100; console.log("2. code before the second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next());
Resultado
1. código antes do primeiro rendimento (valor: 100, feito: falso)
Aqui,
- Um objeto gerador denominado
generator
é criado. - Quando
generator.next()
é chamado, o código até o primeiroyield
é executado. Quandoyield
é encontrado, o programa retorna o valor e pausa a função do gerador.
Nota : Você precisa atribuir objetos gerador a uma variável antes de usá-la.
Trabalho de múltiplas declarações de rendimento
A yield
expressão retorna um valor. No entanto, ao contrário da return
instrução, ela não encerra o programa. É por isso que você pode continuar executando o código a partir da última posição produzida. Por exemplo,
function* generatorFunc() ( console.log("1. code before first yield"); yield 100; console.log("2. code before the second yield"); yield 200; console.log("3. code after the second yield"); ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());
Resultado
1. código antes do primeiro rendimento (valor: 100, feito: falso) 2. código antes do segundo rendimento (valor: 200, feito: falso) (valor: indefinido, feito: verdadeiro)
Veja como funciona este programa.
- A primeira
generator.next()
instrução executa o código até a primeira instrução de rendimento e pausa a execução do programa. - O segundo
generator.next()
inicia o programa a partir da posição de pausa. - Quando todos os elementos são acessados, ele retorna (valor: undefined, done: true).

Passando Argumentos para Funções Geradoras
Você também pode passar argumentos para uma função geradora. Por exemplo,
// generator function function* generatorFunc() ( // returns 'hello' at first next() let x = yield 'hello'; // returns passed argument on the second next() console.log(x); console.log('some code'); // returns 5 on second next() yield 5; ) const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next(6)); console.log(generator.next());
Resultado
(valor: "hello", done: false) 6 algum código (value: 5, done: false) (value: undefined, done: true)
No programa acima,
- O primeiro
generator.next()
retorna o valor deyield
(neste caso, 'hello'). No entanto, o valor não é atribuído à variável x emlet x = yield 'hello';
(valor: "olá", feito: falso)
- Quando
generator.next(6)
é encontrado, o código começa novamente emlet x = yield 'hello';
e o argumento 6 é atribuído a x. Além disso, o código restante é executado até o segundoyield
.6 algum código (valor: 5, feito: falso)
- Quando o terceiro
next()
é executado, o programa retorna (valor: undefined, done: true). É porque não existem outras declarações de rendimento.(valor: indefinido, feito: verdadeiro)
Geradores são usados para implementar iteráveis
Os geradores fornecem uma maneira mais fácil de implementar iteradores.
Se você deseja implementar um iterador manualmente, deve criar um iterador com o next()
método e salvar o estado. Por exemplo,
// creating iterable object const iterableObj = ( // iterator method (Symbol.iterator)() ( let step = 0; return ( next() ( step++; if (step === 1) ( return ( value: '1', done: false); ) else if (step === 2) ( return ( value: '2', done: false); ) else if (step === 3) ( return ( value: '3', done: false); ) return ( value: '', done: true ); ) ) ) ) for (const i of iterableObj) ( console.log(i); )
Resultado
1 2 3
Como os geradores são iteráveis, você pode implementar um iterador de uma maneira mais fácil. Em seguida, você pode iterar pelos geradores usando o for… of
loop. Por exemplo,
// generator function function* generatorFunc() ( yield 1; yield 2; yield 3; ) const obj = generatorFunc(); // iteration through generator for (let value of obj) ( console.log(value); )
Métodos Geradores
Método | Descrição |
---|---|
next() | Retorna um valor de rendimento |
return() | Retorna um valor e encerra o gerador |
throw() | Lança um erro e encerra o gerador |
JavaScript return Vs yield Palavra-chave
retornar palavra-chave | rendimento palavra-chave |
---|---|
Retorna o valor e encerra a função. | Retorna o valor e interrompe a função, mas não a encerra. |
Disponível nas funções normais e nas funções do gerador. | Disponível apenas em funções de gerador. |
Função de gerador de JavaScript com retorno
You can use the return
statement in a generator function. The return
statement returns a value and terminates the function (similar to regular functions). For example,
// generator function function* generatorFunc() ( yield 100; return 123; console.log("2. some code before second yield"); yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); console.log(generator.next()); console.log(generator.next());
Output
(value: 100, done: false) (value: 123, done: true) (value: undefined, done: true)
In the above program, when the return
statement is encountered, it returns the value and done
property becomes true
, and the function terminates. Hence, the next()
method after the return
statement does not return anything.
Note: You can also use the return()
method instead of the return
statement like generator.return(123);
in the above code.
JavaScript Generator Throw Method
Você pode lançar explicitamente um erro na função do gerador usando o método throw (). O uso do throw()
método gera um erro e encerra a função. Por exemplo,
// generator function function* generatorFunc() ( yield 100; yield 200; ) // returns generator object const generator = generatorFunc(); console.log(generator.next()); // throws an error // terminates the generator console.log(generator.throw(new Error('Error occurred.'))); console.log(generator.next());
Resultado
(valor: 1, feito: falso) Erro: ocorreu um erro.
Usos de geradores
- Os geradores nos permitem escrever um código mais limpo enquanto escrevemos tarefas assíncronas.
- Os geradores fornecem uma maneira mais fácil de implementar iteradores.
- Os geradores executam seu código apenas quando necessário.
- Os geradores são eficientes em termos de memória.
Os geradores foram introduzidos no ES6 . Alguns navegadores podem não suportar o uso de geradores. Para saber mais, visite o suporte de Geradores de JavaScript.