Generators es un estilo Coroutine (Coroutine) de JavaScript. Se refiere a funciones que se pueden detener y luego reanudarse durante la ejecución. La función se acompaña de símbolos de asterisco en la función, como la función*, y algunas palabras clave características en la función, como el rendimiento y el rendimiento*.
function* generatorfn () {console.log ('Look ma i fue suspendido')} var generador = generadorfn () // [1] setTimeOut (function () {generador.next () // [2]}, 2000)Los [1] y [2] marcados en el código se explican de la siguiente manera:
1. Este es un generador que comienza con una pausa. No hay salida de consola en este momento.
2. Solo llamando a su método Next () se puede ejecutar el generador y ejecutar hasta que encuentre la siguiente palabra clave o retorno de rendimiento. Ahora tenemos la salida de la consola.
Veamos otro caso:
function *generador () {console.log ('comienza!'); var i = 0; while (true) {if (i <3) produce i ++; }} var gen = generador ();El código anterior es similar al primero, pero hay una palabra clave de rendimiento adicional en la función del generador. Cuando se llame al código anterior, no se ejecutará de inmediato, pero detendrá el estado de espera, por lo que no habrá salida de inicio. No se ejecuta hasta su siguiente () llamada.
var ret = gen.next (); // start! console.log (ret); // {valor: 0, hecho: falso}El RET anterior es el resultado del generador. Tiene dos propiedades:
■ Valor, valor de rendimiento en la función del generador,
■ Hecho, esta es una bandera que indica si la función del generador regresa.
Continúe con el código de la siguiente manera:
console.log (gen.next ()); // {valor: 1, hecho: falso} console.log (gen.next ()); // {valor: 2, hecho: falso} console.log (gen.next ()); // {valor: intefined, real: true}El generador no tiene misterio en la programación sincrónica, y es especialmente adecuado para la programación asincrónica.
El generador tiene dos características:
1. Puede elegir saltar de una función, dejar que el código externo decida cuándo regresar a esta función y continuar con la ejecución.
2. Capaz de realizar un control asincrónico.
Mire el siguiente código de ejecución asíncrono:
var gen = generator (); console.log (gen.next (). valor); setTimeOut (function () {console.log (gen.next (). valor); console.log ('primer paso');}, 1000); console.log ('segundo paso');La salida es:
0
Paso 2
1
primer paso
En otras palabras, no esperará a que el tiempo de espera finalice en SetTimeout, pero continuará directamente con el "segundo paso" y no se bloqueará en SetTimeout.
Veamos otro código:
function* canal () {var name = rendimiento 'Hola, ¿cuál es tu nombre?' // [1] return 'well hola' + nombre} var gen = canal () console.log (gen.next (). Valor) // Hola, ¿cuál es su nombre? [2] console.log (gen.next ('billy')) // bien hola billy [3]También puede usar * durante el recorrido:
función* iter () {for (var i = 0; i <10; i ++) rendimiento i} para (var val de iter ()) {console.log (val) // salidas 1? -? 9}Malentendidos comunes
Como puedo pausar una ejecución de funciones, ¿debo dejar que se ejecute en paralelo? No, porque JavaScript es un solo hilo, y si desea buscar mejoras de rendimiento, el generador no es su plato.
Por ejemplo, el siguiente código ejecuta números de Fibonacci por separado:
function fib (n) {var creten = 0, next = 1, swap for (var i = 0; i <n; i ++) {swap = current, current = next = swap+next} return -current} function* fibgen (n) {var current = 0, next = 1, swap for (var i = 0; i <n; i ++) {swap = swap = current = swap+swap+stentinLos resultados de rendimiento son los siguientes: (cuanto más alto, mejor)
Resultados:
Regular 1263899
Generador 37541
Los generadores brillan
Los generadores pueden simplificar la complejidad de las funciones en JavaScript.
Tarea perezosa
Aunque la asignación perezosa se puede implementar utilizando los cierres de JS, el uso del rendimiento se simplificará enormemente. A través de pausa y recuperación, podemos obtener valores numéricos cuando lo necesitamos. Por ejemplo, la función FIBGEN anterior puede extraer nuevos valores cuando lo necesitamos:
var fibiter = fibgen (20) var next = fibiter.next () console.log (next.Value) setTimeOut (function () {var next = fibiter.next () console.log (next.value)}, 2000) Por supuesto, también usa un bucle para: aún es perezoso para asignar para (var n de fibgen (20) {console.Log (n)}Secuencia infinita
Debido a que puede ser flojo para asignar valores, puede realizar algunos trucos de Haskell, similar a las secuencias infinitas. Aquí puede obtener el número de una secuencia infinita.
function* fibgen () {var current = 0, next = 1, swap while (true) {swap = current, current = next = swap + next rendimiento corriente}}Veamos la asignación perezosa de una transmisión Fibonacci y solicitemos que devuelva el primer número de Fibonacci después de 5000:
for (var num de fibgen ()) {if (num> 5000) break} console.log (num) // 6765Control de procesos asíncrono
Uso de generadores para implementar el control de procesos asincrónicos, con mayor frecuencia varios paquetes de biblioteca de promesas, entonces, ¿cómo funciona?
En el mundo del nodo, todo está relacionado con las devoluciones de llamada, que es nuestra función asincrónica de bajo nivel. Podemos usar generadores para construir un canal de comunicación, para escribir código asíncrono en el estilo de programación síncrona.
run (function* () {console.log ("iniciar") var file = rendimiento readfile ("./ async.js") // [1] console.log (file.ToString ())})Nota 1 significa que el programa continuará antes de esperar a que Async.js devuelva el resultado.
Genify es un marco que lleva los generadores a un entorno de programación normal, utilizando lo siguiente:
NPM Instalar Genify para la instalación, el código es el siguiente:
var q = require ('q'); var fs = require ('fs'); var genify = require ('genify'); // envuelve su objeto en genify functionVar object = genify ({concatFiles: function * (file1, file2, outFile) {file1 = rendimiento q.nfcall (fs.ReadFile, file1); file2 = rendimiento q.nfcall (fs.ReadFile, file2); var (file1 + file2; rendimiento q.nfcall (fs.writefile, contrate; contratado); }}); // ConcatFiles es una función de generador que utiliza las potentes capacidades de los generadores. object.concatFiles ('./ somefile1.txt', './somefile2.txt', './concated.txt')La explicación detallada anterior del uso de generadores JavaScript en Node.js es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.