ES6: Generadores

Continuamos viendo las novedades que nos presenta ES6. En esta entrada, veremos los generadores. Los generadores son funciones especiales que nos permiten pausar la ejecución y volver a reanudar la ejecución desde donde nos habíamos quedado.

Antes de nada vamos a ver su sintaxis. Porque aunque se declara y llama de manera parecida a las funciones, no es igual.

El código de arriba es un ejemplo de como se declararía un generador. Como vemos, se declara como una función, pero entre el function  y el nombre de la función, se pone un *. En realidad, da igual que lo pongas pegado a function , entre dos espacios, pegado al nombre de la función o sin espacios. Así que puedes ponerlo como te sea más cómodo, pero si quieres declarar un generador tienes que ponerlo. 🙂

Cómo ya he dicho anteriormente, los generadores son funciones que pueden ser pausadas y esto se hace con la instrucción yield . yield  funciona como si fuese un return, pero para los generadores.

Ahora, vamos a ver como se llamaría, porque pasa lo mismo que con la declaración. Es parecida, pero no igual.

En el código anterior, vemos como se llama a un generador. Primero de todo, llamamos a la función declarada anteriormente, que si te fijas no se está ejecutando en este momento, y asignamos el iterador que nos devuelve a una constante. Después, ejecutamos el método .next()  y es aquí cuando realmente se está ejecutando la función, pero cuando se encuentra un yield  se pausa. Cuando volvemos a ejecutar el método .next()  vuelve a ejecutarse desde donde se había quedado, hasta que se encuentre el próximo yield . Así funcionan los generadores.

Lo que nos devuelve el método .next()  es un objeto con el valor (value) devuelto con el yield  y nos dice si ya ha finalizado el iterador (done) con un true o false. Cuando finaliza, nos devuelve que el value es undefined y el done es true.

El ejemplo anterior puedes verlo en vivo aquí: https://repl.it/@vreaxe/ES6-Generadores

 

Vamos a ver un ejemplo completo con un generador. Por ejemplo, con una función muy sencilla que comprueba si un string es un palíndromo:

Ver código anterior en vivo: https://repl.it/@vreaxe/ES6-Ejemplo-generador

El funcionamiento del generador es el mismo explicado anteriormente. Le pasamos un array de strings al generador, se recorre este array con un bucle for-of, se comprueba si el string es palíndromo y devuelve con yield  el valor que devuelve la función checkPalindrome .


Aloja tu proyecto en DigitalOcean: Obtén $200 de crédito gratis al registrarte a través de este enlace.

Si hay cualquier tipo de error en el post o te surge cualquier duda, no dudes en ponerlo en los comentarios o enviarme un correo desde la página de contacto.

? CONTACTAR

Deja una respuesta

  Acepto la política de privacidad