He comenzado un pequeño proyecto que trata de hacer esto con un poco de truco de devolución de llamada. Puesto que es imposible crear corrutinas reales en "estándar" JavaScript, esto no está exento de algunas advertencias, por ejemplo:
- que es imposible hacer esto sigue el protocolo de iteración (cosas como
.next()
etc.),
- es imposible iterar a través de varios generadores a la vez,
- usted tiene que estar atento a no dejar que los objetos equivocados salen del alcance del generador (por ejemplo, llamando
yield
en un tiempo de espera – ya que esto es "normal" JavaScript, no hay restricción de sintaxis que le impide hacer esto),
- exce Las funciones en el generador son un poco complicadas,
- y, por último, es muy experimental (esto comenzó hace unos días).
Del lado positivo, tiene yield
! :)
El ejemplo de Fibonacci de la MDC page se vería así:
var fibonacci = Generator(function() {
var fn1 = 1;
var fn2 = 1;
while (1){
var current = fn2;
fn2 = fn1;
fn1 = fn1 + current;
this.yield(current);
}
});
console.log(fibonacci.take(10).toArray());
Salida:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
El proyecto está en BitBucket en https://bitbucket.org/balpha/lyfe.
Aunque se responde a esta pregunta, me sorprende que nadie haya mencionado [regenerator] (https://facebook.github.io/regenerator/) aún. –