Foro de elhacker.net

Programación => Desarrollo Web => Mensaje iniciado por: @XSStringManolo en 24 Abril 2020, 22:45 pm



Título: Generadores o funciones generadoras en javascript por StringManolo
Publicado por: @XSStringManolo en 24 Abril 2020, 22:45 pm
Los generadores o funciones generadores simplifican la tarea de escribir iteradores. En lugar de retornar un valor se genera una secuencia de resultados o una serie de valores. Este tipo de funciones retornan un objeto con el método next() que utilizamos para avanzar en la secuencia de expresiones definidas en el cuerpo de la función.

Código
  1. function* generarSecuencia() {
  2. yield 5 + 6;
  3. yield String.fromCharCode(parseInt("1110000", 2).toString(10));
  4. yield 3 + 4;
  5. return 14;
  6.  
  7. }
  8.  
  9. var secuencia = generarSecuencia();
  10.  
  11. alert( JSON.stringify(secuencia.next()) );
  12. alert( JSON.stringify(secuencia.next()) );
  13. alert( JSON.stringify(secuencia.next()) );
  14. alert( JSON.stringify(secuencia.next()) );
  15. alert( JSON.stringify(secuencia.next()) );
En este ejemplo primero definimos la función generadora.
Definimos cada campo precedido por la keyword yield.
Retornamos la ejecución.
En el parámetro del alert invocamos next() sobre la función y utilizamos JSON.stringify para convertir el objeto en un string para ver exactamente que contiene cada objeto retornado:
{"value":11,"done":false}
{"value":"p","done":false}
{"value":7,"done":false}
{"value":14,"done":true}
{"done":true}

 Cuando haces una llamada a este tipo de funciones su código no es ejecutado directamente, en su defecto, retorna un objeto generador que maneja la ejecución.

 El método next() nos retornará un objeto con la propiedad/key value que contiene el valor generado por la instrucción alcanzada por el objeto generator y otra propiedad de tipo booleano primitivo en el mismo objeto retornado llamada done. Esta propiedad nos indica si la función retornó su ejecución al código de llamada a través del objeto generator. Es decir, si la función ha finalizado.
Esta propiedad podemos utilizarla como iterador para evaluar las instrucciones del cuerpo de la función.
Cuando ocurre un error en uno de los campos se retornará también la propiedad done = true a menos que se implemente manejo de excepciones sobre el campo o la expresión.

Las propias funciones generadoras son iterables y podemos usar expresiones de la índole de for (valor of generador) para recorrer sus instrucciones.

Es también una buena forma remplazar callbacks evitando los problemas comunes de los callbacks en la programación asíncrona.

La funciones generadoras también permiten realizar bucles infinitos.
Código
  1. function* generarSecuenciaInfinita() {
  2. var inicial = -1;
  3. while(1) {
  4. yield inicial += 2;
  5. }
  6. }
  7.  
  8. var secuencia = generarSecuenciaInfinita();
  9.  
  10. var valor = 0;
  11. var nImpares = "";
  12. var nPares = "";
  13. while(valor < 30) {
  14. valor = secuencia.next().value;
  15. if(valor < 30) {
  16. nImpares += valor + " ";
  17. nPares += "" + (+valor + 1) + " ";
  18. }
  19. }
  20.  
  21. document.write("Números Impares menores que 30: " + nImpares);
  22. document.write("<br />Números Pares menores que 30: " + nPares);