.
Si has sido un desarrollador de JavaScript durante los últimos dos o cinco años, seguramente te habrás encontrado con posts que hablan de Generadores e Iteradores. Mientras que los Generadores y los Iteradores están inherentemente asociados, los Generadores parecen un poco más intimidantes que el otro.
Los Iteradores son una implementación de objetos Iterables como mapas, arrays y cadenas que nos permite iterar sobre ellos utilizando next(). Tienen una amplia variedad de casos de uso a través de Generadores, Observables y operadores de propagación.
Recomiendo el siguiente enlace para aquellos de ustedes que son nuevos a los iteradores, Guía de Iteradores.
Para comprobar si su objeto se ajusta al protocolo iterable, verifique el uso de la incorporada Symbol.iterator:
Los generadores introducidos como parte de ES6 no han sufrido ningún cambio para las versiones posteriores de JavaScript y están aquí para quedarse más tiempo. Quiero decir, ¡mucho tiempo! Así que no hay que huir de ello. Aunque ES7 y ES8 tienen algunas actualizaciones nuevas, no tienen la misma magnitud de cambio que tuvo ES6 con respecto a ES5, que llevó a JavaScript al siguiente nivel, por así decirlo.
Al final de este post, estoy seguro de que tendrás una sólida comprensión de cómo funcionan los Generadores de funciones. Si eres un profesional, por favor ayúdame a mejorar el contenido añadiendo tus comentarios en las respuestas. Por si acaso, si tienes dificultades para seguir el código, también he añadido la explicación de la mayor parte del código para ayudarte a entender mejor.
Las funciones en JavaScript, como todos sabemos, «se ejecutan hasta el retorno/final». Las Funciones Generadoras por otro lado, «se ejecutan hasta yield/return/end». A diferencia de las funciones normales las Funciones Generadoras una vez llamadas, devuelven el Objeto Generador, que contiene todo el Iterable Generador que puede ser iterado usando el método next() o el bucle for…of.
Cada llamada a next() en el generador ejecuta cada línea de código hasta el siguiente yield que encuentra y suspende su ejecución temporalmente.
Sintácticamente se identifican con un *, ya sea función* X o función *X, – ambas significan lo mismo.
Una vez creada, la llamada a la función generadora devuelve el Objeto Generador. Este objeto generador necesita ser asignado a una variable para llevar la cuenta de los subsiguientes métodos next() llamados sobre sí mismo. Si el generador no se asigna a una variable entonces siempre rendirá sólo hasta la primera expresión yield en cada next().
Las funciones generadoras se construyen normalmente utilizando expresiones yield. Cada yield dentro de la función generadora es un punto de parada antes de que comience el siguiente ciclo de ejecución. Cada ciclo de ejecución se desencadena mediante el método next() del generador.
En cada llamada a next(), la expresión yield devuelve su valor en forma de objeto que contiene los siguientes parámetros.
{ value: 10, done: false } // assuming that 10 is the value of yield
- Valor – es todo lo que se escribe a la derecha de la palabra clave yield, puede ser una llamada a una función, un objeto o prácticamente cualquier cosa. Para los rendimientos vacíos este valor es indefinido.
- Done – indica el estado del generador, si se puede ejecutar más o no. Cuando done devuelve true, significa que la función ha terminado su ejecución.
(Si crees que está un poco por encima de tu cabeza, lo tendrás más claro cuando veas el ejemplo de abajo…)