En este tutorial, aprenderá sobre los generadores de JavaScript con la ayuda de ejemplos.
En JavaScript, los generadores proporcionan una nueva forma de trabajar con funciones e iteradores.
Usando un generador,
- puede detener la ejecución de una función desde cualquier lugar dentro de la función
- y continuar ejecutando código desde una posición detenida
Crear generadores de JavaScript
Para crear un generador, primero debe definir una función de generador con function*
símbolo. Los objetos de las funciones generadoras se denominan generadores.
// define a generator function function* generator_function() (… ) // creating a generator const generator_obj = generator_function();
Nota : La función del generador se indica mediante *
. Puede usarlos function* generatorFunc() (… )
o function *generatorFunc()(… )
crearlos.
Usar rendimiento para pausar la ejecución
Como se mencionó anteriormente, puede pausar la ejecución de una función generadora sin ejecutar todo el cuerpo de la función. Para eso, usamos la yield
palabra clave. Por ejemplo,
// 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());
Salida
1. código antes del primer rendimiento (valor: 100, hecho: falso)
Aquí,
- Se
generator
crea un objeto generador con nombre . - Cuando
generator.next()
se llama,yield
se ejecuta el código hasta el primero . Cuandoyield
se encuentra, el programa devuelve el valor y pausa la función del generador.
Nota : Debe asignar objetos de generador a una variable antes de usarla.
Trabajo de múltiples declaraciones de rendimiento
La yield
expresión devuelve un valor. Sin embargo, a diferencia de la return
declaración, no finaliza el programa. Es por eso que puede continuar ejecutando código desde la última posición cedida. Por ejemplo,
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());
Salida
1. código antes del primer rendimiento (valor: 100, hecho: falso) 2. código antes del segundo rendimiento (valor: 200, hecho: falso) (valor: indefinido, hecho: verdadero)
Así es como funciona este programa.
- La primera
generator.next()
declaración ejecuta el código hasta la primera declaración de rendimiento y pausa la ejecución del programa. - El segundo
generator.next()
inicia el programa desde la posición de pausa. - Cuando se accede a todos los elementos, devuelve (valor: indefinido, hecho: verdadero).

Pasar argumentos a funciones generadoras
También puede pasar argumentos a una función generadora. Por ejemplo,
// 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());
Salida
(valor: "hola", hecho: falso) 6 algún código (valor: 5, hecho: falso) (valor: indefinido, hecho: verdadero)
En el programa anterior,
- El primero
generator.next()
devuelve el valor deyield
(en este caso, 'hola'). Sin embargo, el valor no se asigna a la variable x enlet x = yield 'hello';
(valor: "hola", hecho: falso)
- Cuando
generator.next(6)
se encuentra, el código comienza de nuevo enlet x = yield 'hello';
y el argumento 6 se asigna ax. Además, el código restante se ejecuta hasta el segundoyield
.6 algún código (valor: 5, hecho: falso)
- Cuando
next()
se ejecuta el tercero , el programa regresa (valor: indefinido, hecho: verdadero). Es porque no hay otras declaraciones de rendimiento.(valor: indefinido, hecho: verdadero)
Los generadores se utilizan para implementar iterables
Los generadores proporcionan una forma más sencilla de implementar iteradores.
Si desea implementar un iterador manualmente, debe crear un iterador con el next()
método y guardar el estado. Por ejemplo,
// 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); )
Salida
1 2 3
Dado que los generadores son iterables, puede implementar un iterador de una manera más sencilla. Luego puede iterar a través de los generadores usando el for… of
bucle. Por ejemplo,
// 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 de generador
Método | Descripción |
---|---|
next() | Devuelve un valor de rendimiento |
return() | Devuelve un valor y finaliza el generador. |
throw() | Lanza un error y termina el generador |
Retorno de JavaScript Vs palabra clave de rendimiento
volver palabra clave | rendimiento palabra clave |
---|---|
Devuelve el valor y finaliza la función. | Devuelve el valor y detiene la función, pero no la termina. |
Disponible tanto en las funciones normales como en las funciones del generador. | Disponible solo en funciones de generador. |
Función de generador de JavaScript con 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
Puede lanzar explícitamente un error en la función del generador usando el método throw (). El uso del throw()
método arroja un error y finaliza la función. Por ejemplo,
// 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());
Salida
(valor: 1, hecho: falso) Error: se produjo un error.
Usos de generadores
- Los generadores nos permiten escribir código más limpio mientras escribimos tareas asincrónicas.
- Los generadores proporcionan una forma más sencilla de implementar iteradores.
- Los generadores ejecutan su código solo cuando es necesario.
- Los generadores son eficientes en memoria.
Los generadores se introdujeron en ES6 . Es posible que algunos navegadores no admitan el uso de generadores. Para obtener más información, visite Soporte de generadores de JavaScript.