我正在使用的库中的函数调用将生成器返回给我。然后,我将此生成器传递给一个函数,该函数对其进行迭代,并对每个项目进行一堆逻辑处理。然后,在该函数被调用之后,我想引用相同的生成器。但是,似乎生成器不再具有/生成任何项目。代码如下:
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
}
}
答案 0 :(得分:1)
这就是迭代器的工作方式。调用生成器将返回一个迭代器,该迭代器可以迭代一次。在其他大多数语言中也是如此。
let generator = function* () {
for (let i = 0; i < 3; i++)
yield i;
};
let iterator = generator();
console.log(Array.from(iterator)); // [1...3]
console.log(Array.from(iterator)); // []
console.log(Array.from(generator())); // [1..3]
console.log(Array.from(generator())); // [1..3]
答案 1 :(得分:1)
其他人已经解释了为什么发生这种情况,但是我还是要回顾一下。
Generator functions返回一个generator object,它使用对自身的简单循环引用来实现iterable protocol(一个Symbol.iterator
属性)和iterator protocol( next()
方法)以有状态地迭代其生成器函数的控制流。
要解决您的问题,请通过返回生成器对象的单独实例,将生成器函数调用与一个实现可迭代协议的对象封装在一起,您可以使用相同的方式使用它:
const iterable = { [Symbol.iterator]: () => this.generatorFunc() };
console.log(Array.from(iterable).length); //prints N which is specified elsewhere
this.iterateThroughGenerator(iterable);
console.log(Array.from(iterable).length); //still prints N
iterateThroughGenerator(iterable) {
for(let element of iterable) {
// do a bunch of stuff with element
}
}
答案 2 :(得分:0)
一旦生成器函数完成,则必须调用this.getGeneratorFunc()再次重新创建生成器。同样,当您执行Array.from(myGenerator)时,它也会完成该生成器,因此,当您调用this.iterateThroughGenerator(myGenerator)时,将不会发生任何事情,因为生成器不再返回任何元素。因此,您可以将生成器的结果保存到数组中并重用该数组,或者每次想从中获取元素时都调用this.getGeneratorFunc()三次。在这个具体示例中,我会
const generated = Array.from(this.getGeneratorFunc());
console.log(generated.length);
this.iteratedItems(generated);
console.log(generated.length);
也请查看此答案。 Previous Answer
ID还读了this。
答案 3 :(得分:0)
Array.from()
耗尽了生成器(迭代直到结束),并且对其进行进一步迭代将不再产生任何元素。 next()
呼叫将始终返回{value: undefined, done: true}
。
要创建从头开始的新生成器,您需要再次调用generatorFunc()
。