【发布时间】:2019-11-10 16:34:45
【问题描述】:
我有一个生成器通过我正在使用的库中的函数调用返回给我。然后我将这个生成器传递给一个函数,该函数遍历它并对每个项目执行一堆逻辑。然后我想在调用该函数后引用同一个生成器。但是,生成器似乎不再拥有/生成任何项目。代码大致如下:
let myGenerator = this.generatorFunc();
console.log(Array.from(myGenerator).length); //prints N which is specified elsewhere
this.iterateThroughGenerator(myGenerator);
console.log(Array.from(myGenerator).length); //now prints 0 when I need it to be N still
iterateThroughGenerator(generator) {
for(let element of generator) {
// do a bunch of stuff with element
}
}
【问题讨论】:
-
this.getGeneratorFunc()的定义是什么? -
@PatrickRoberts 这是我正在使用的库中的定义。基本上只是用来生成一组多边形。 github.com/d3/d3-delaunay/blob/…
-
在这种情况下,
getGeneratorFunc()的名字很糟糕。该函数是生成器函数。它返回一个生成器迭代器,它只能被消费一次。 -
因为生成器迭代器具有内部状态,可以跟踪每次调用
next()时从其生成器函数的控制流中的哪个点恢复。一旦其内部状态到达函数的末尾,next()将简单地返回{ value: undefined, done: true },正如 Bergi 在他的回答中所解释的那样。 -
迭代器的目的不是它们对集合进行一次迭代,而是它们可以被增量使用,因为它们是有状态的。他们只迭代底层集合一次的事实只是有状态的限制。
标签: javascript ecmascript-6 iteration generator es6-generator