从迭代器/生成器获取单个屈服值

时间:2016-05-08 21:42:33

标签: javascript node.js ecmascript-6 generator

我需要在每次调用后返回递增整数的实体。

例如我有代码。

var id = 0; //global variable =(

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

它工作正常。但我想使用发电机进行这项工作。

类似的东西:

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

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

但结果只是空图引号。我错过了什么?也许使用发电机对于这类发电来说是一个坏主意?

3 个答案:

答案 0 :(得分:8)

你的getId是一个生成器函数,它创建一个生成器,而不是前进并获取其值 你应该做点什么

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());
    …
}

答案 1 :(得分:3)

以下是我能说的错误:

  • 您正在重置每个函数调用的id值。
  • 让生成器输出你需要生成迭代器的下一次迭代的值,然后你可以访问它的next().value

以下是一个例子:



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()




答案 2 :(得分:1)

如果你......

  • 不想污染你的命名空间
  • 想要短代码

然后,在这种情况下,关闭增量变量的 IIFE 可能会比function*更好地服务

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

getId(); // 0
getId(); // 1
getId(); // 2