Necesito una entidad que devuelva un número entero incremental después de cada llamada.

Por ejemplo tengo código.

var id = 0; //global variable =(

function foo() {
   ....
   console.log("Your unique ID is " + id++);
   ....
}

Y funciona bien Pero quiero usar generadores para este trabajo.

Algo así como:

function* getId() {
   var id = 0;
   while (true) {
       yield id++;
   }
}

 function foo() {
   ....
   console.log("Your unique ID is " + getId());
   ....
}

Pero el resultado son solo citas vacías. ¿Lo que me faltaba? ¿Quizás usar generadores es una mala idea para este tipo de generación?

2
Stepan Loginov 9 may. 2016 a las 00:42

3 respuestas

La mejor respuesta

Su getId es una función generadora que crea un generador, en lugar de avanzar uno y obtener sus valores.
Deberías hacer algo como

function* IdGenerator() {
    var i = 0;
    while (true) {
        yield i++;
    }
}
IdGenerator.prototype.get = function() {
    return this.next().value;
};

var ids = IdGenerator();
function foo() {
    …
    console.log("Your unique ID is " + ids.get());
    …
}
8
Bergi 8 may. 2016 a las 22:29

Aquí están las cosas que puedo decir que están mal:

  • está restableciendo el valor de identificación en cada llamada de función.
  • para que el generador genere el valor de la próxima iteración, necesita generar el iterador, luego puede acceder a su next().value

Este es un ejemplo:

function* getId() {
 var id = 0;
    while (true) {
      yield id++;
    };
}

var itId = getId();

function foo() {
  console.log("Your unique ID is " + itId.next().value);
}

foo()
foo()
3
maioman 17 jun. 2016 a las 14:10

Si tu..

  • no quiero contaminar tu espacio de nombres
  • quiero código corto

Entonces, tal vez un cierre IIFE sobre la variable incrementada le servirá mejor que un function* en este caso

var getId = (function () {
    var i = 0;
    return () => i++;
}());

getId(); // 0
getId(); // 1
getId(); // 2
1
Paul S. 8 may. 2016 a las 22:43