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 los generadores?
Generatorse han vuelto bastante famosos en Node.js en los últimos tiempos y eso probablemente se deba a lo que son capaces de hacer.
- GeneratorLas s son ejecuciones de funciones que pueden suspenderse y reanudarse en un momento posterior.
- GeneratorLos s son útiles cuando se llevan a cabo conceptos como "ejecución diferida". Esto básicamente 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.
- 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.
- 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 se pueden utilizar los generadores.
En nuestro ejemplo, tendremos una función Agregar simple que sumará 2 números, pero seguiremos deteniendo la ejecución del método en diferentes puntos para mostrar cómo se pueden usar los generadores.
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
- El primer paso es definir nuestra “función” generadora. Ten en cuenta que esto se hace agregando un “*” a la palabra clave function. Luego, definimos una función llamada Add que toma un parámetro de x.
- La palabra clave yield es específica de los generadores. Esto la convierte en una construcción poderosa para pausar una función en medio de cualquier cosa. Por lo tanto, 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 se convertirá en 6 y se detendrá la ejecución de la función.
- Aquí es donde primero llamamos a la función generadora y enviamos el valor 5 a nuestra función Add. Este valor se sustituirá en el parámetro x de nuestra función Add.
- 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.
- 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 llamadas vs. generadores
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 los generadores resultan útiles. Uno de los ejemplos más comunes es cuando se crean funciones de temporizador.
Veamos el siguiente ejemplo de cómo los generadores pueden resultar útiles frente a las devoluciones de llamadas.
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.
function Timedelay(ptime, callback) { setTimeout(function() { callback("Pausing for " + ptime); }, time); }
Explicación del código
- 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.
- El siguiente paso es simplemente crear un mensaje que se mostrará al usuario indicando que la aplicación se pausará durante esta cantidad 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.
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
- Llamamos a Timedelay como una devolución de llamada con 1000 como valor.
- A continuación queremos volver a llamar a la función Timedelay con 2000 como valor.
- 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 generadores. Con el código que se muestra a continuación, puede ver lo sencillo que se ha vuelto implementar la función Timedelay usando generadores.
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
- Primero definimos una función generadora que se utilizará para llamar a nuestra función Timedelay.
- Llamamos a la función Rendimiento junto con la función Timedelay con 1000 como valor de parámetro.
- Luego llamamos a la función Yield junto con la función Timedelay con 2000 como valor del parámetro.
- 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 'yield' en la función asincrónica.