Node.js Generators y comparar con devoluciones de llamada

En este tutorial, vamos a aprender sobre Generators y sus diferencias con los Callbacks

¿Qué son generators?

Generatorse han vuelto bastante famosos en Node.js en los últimos tiempos y eso probablemente se deba a lo que son capaces de hacer.

  • GeneratorLos s son ejecuciones de funciones que se pueden suspender y reanudar en un later punto.
  • GeneratorSon útiles a la hora de realizar concepts como "ejecución diferida". Básicamente, esto significa que al suspender la ejecución y reanudarla a voluntad, podemos extraer valores solo cuando lo necesitamos.

GeneratorTenemos los siguientes 2 métodos clave.

  1. método de rendimiento – El método de rendimiento se llama en una función para detener la ejecución de la función en la línea específica donde se llama al método de rendimiento.
  2. Siguiente método – Este método se llama desde la aplicación principal para reanudar la ejecución de una función que tiene un método de rendimiento. La ejecución de la función continuará hasta el siguiente método de rendimiento o hasta el final del método.

Veamos un ejemplo de cómo generatorSe pueden utilizar s.

En nuestro ejemplo, vamos a tener una función Agregar simple que agregará 2 numbers, pero seguiremos deteniendo la ejecución del método en diferentes puntos para mostrar cómo generatorSe pueden utilizar s.

Node.js Generators

function* Add(x) {
   yield x + 1;
   var y = yield(null);
   y = 6
   return x + y;
}

var gen = Add(5);

gen.next();

gen.next(); 

Explicación del código

  1. El primer paso es definir nuestra generator "función". Tenga en cuenta que esto se hace agregando un "*" a la palabra clave de función. Luego estamos definiendo una función llamada Agregar que toma un parámetro de x.
  2. La palabra clave de rendimiento es específica de generators. Esto lo convierte en una construcción poderosa para pausar una función en medio de cualquier cosa. Entonces, aquí, la ejecución de la función se detendrá hasta que invoquemos la función next(), lo que se realizará en el Paso 4. En este punto, el valor de x pasará a ser 6 y se detendrá la ejecución de la función.
  3. Aquí es donde llamamos por primera vez al generator función y enviar el valor de 5 a nuestra función Agregar. Este valor se sustituirá en el parámetro x de nuestra función Agregar.
  4. Una vez que llamemos a la función next(), la función Add() reanudará la ejecución. Cuando se ejecute la siguiente instrucción var y= yield(null), la función Add() dejará de ejecutarse nuevamente.
  5. Ahora, después de llamar nuevamente a la función next(), se ejecutarán las siguientes declaraciones y se agregará y devolverá el valor combinado de x=5 e y=6.

Devoluciones de llamada vs. generators

GeneratorLos s se utilizan para resolver el problema de lo que se conoce como infierno de devolución de llamada. A veces, las funciones de devolución de llamada se anidan tanto durante el desarrollo de una aplicación Node.js que resulta demasiado complicado usar funciones de devolución de llamada.

Aquí es donde generatorSon útiles. Uno de los ejemplos más comunes de esto es cuando se crean funciones de temporizador.

Veamos el siguiente ejemplo de cómo generators puede resultar útil en las devoluciones de llamada.

Nuestro ejemplo simplemente creará una función de retardo de tiempo simple. Entonces querríamos llamar a esta función incorporando un retraso de 1000, 2000 y 3000 ms.

Paso 1) Defina nuestra función de devolución de llamada con el código de retardo de tiempo necesario.

Devoluciones de llamada vs. Generators

function Timedelay(ptime, callback) {

setTimeout(function() {
  
    callback("Pausing for " + ptime);
    
  }, time);
}

Explicación del código

  1. Aquí estamos creando una función llamada Timedelay con un parámetro llamado ptime. Esto tomará el retraso de tiempo necesario que queremos introducir en nuestra aplicación.
  2. El siguiente paso es simplemente crear un mensaje, que se mostraráyed al usuario diciendo que la aplicación se va a pausar por estos muchos numbers de milisegundos.

Paso 2) Ahora veamos el código si estuviéramos incorporando devoluciones de llamada. Supongamos que queremos incorporar devoluciones de llamada basadas en el valor de 1000, 2000 y 3000 milisegundos. El siguiente código muestra cómo necesitaríamos implementarlas mediante devoluciones de llamada.

Devoluciones de llamada vs. Generators

Timedelay(1000, function(message) {
  
  console.log(msg);
  Timedelay(2000, function(message) {
    
    console.log(msg);
    Timedelay(3000, function(message) {
      
      console.log(msg);
  })
  })
})

Explicación del código

  1. Llamamos a Timedelay como una devolución de llamada con 1000 como valor.
  2. A continuación queremos volver a llamar a la función Timedelay con 2000 como valor.
  3. Finalmente, queremos volver a llamar a la función Timedelay con 3000 como valor.

En el código anterior, puede ver que se vuelve más complicado ya que queremos comenzar a llamar a la función varias veces.

Paso 3) Ahora veamos cómo implementar el mismo código usando generators. En el siguiente código, ahora puede ver lo sencillo que se ha vuelto implementar la función Timedelay usando generators.

Devoluciones de llamada vs. Generators

function* Messages() {
  console,log(yield(Timedelay(1000, function(){})));
  console,log(yield(Timedelay(2000, function(){})));
  console,log(yield(Timedelay(3000, function(){})));
}

Explicación del código

  1. Primero estamos definiendo un generator función que se utilizará para llamar a nuestra función Timedelay.
  2. Llamamos a la función Rendimiento junto con la función Timedelay con 1000 como valor de parámetro.
  3. Luego llamamos a la función Yield junto con la función Timedelay con 2000 como valor del parámetro.
  4. Finalmente, llamamos a la función Rendimiento junto con la función Timedelay con 3000 como valor de parámetro.

Resumen

Generators también se puede utilizar para aliviar los problemas con las devoluciones de llamadas anidadas y ayudar a eliminar lo que se conoce como el infierno de las devoluciones de llamadas. GeneratorLos s se utilizan para detener el procesamiento de una función. Esto se logra mediante el uso del método de "rendimiento" en elsyncfunción crónica.