Puede que la primera vez que lo veas pienses que se trata de un error del autor del código, pero lo cierto es que es una de las novedades que ECMAScript 6 trajo consigo allá por el 2015. function* es la forma de definir lo que se conoce como funciones generadoras pero ¿y esto para qué sirve? Mejor vamos a verlo con un ejemplo 🙂
Las funciones que todos conocemos tratan de un fragmento de código que se ejecuta de principio a fin cuando las invocamos. Estas funciones no pueden ser pausadas para ejecutar otro código entre medias, ni tampoco podemos cancelarlas.
Sin embargo, las funciones generadoras rompen con ese comportamiento: Estas pueden ser pausadas y se pueden retomar en otro momento con el fin de que puedas hacer otras tareas entre medias, o incluso cancelarlas si fuera necesario.
Aquí tienes un ejemplo simple de cómo funciona:
function* hello() {
yield 'Hello Gisela';
yield 'Hello Alicia';
yield 'Hello Bea';
}
var helloInstance = hello();
console.log(helloInstance.next());
console.log(helloInstance.next());
console.log(helloInstance.next());
console.log(helloInstance.next());
Como ves, este tipo de funciones tiene dos cosas extrañas: la primera de ellas es la forma de definirlas a través de function*. La segunda es que se utiliza la palabra clave yield, que nos permite definir dónde están las pausas que vamos a hacer dentro de la función. Esto quiere decir que cada vez que continúe con la ejecución irá hasta el siguiente yield que encuentre y luego volverá a salir.
Para poder invocar este tipo de funciones, creamos una instancia, en este caso la he llamado helloInstance, y se llama al método next para que se ejecute, en teoría, hasta que el valor de done sea true, lo cual significa que no hay más yields que ejecutar y que hemos llegado al final de la función.
En el artículo de ayer tienes un ejemplo, donde el orquestador es una función generadora y cada uno de los yields son las diferentes funciones que queremos orquestar.
¡Saludos!