为什么生成器经过迭代后变成空的?

时间:2019-06-28 18:21:10

标签: javascript ecmascript-6 iteration generator es6-generator

我正在使用的库中的函数调用将生成器返回给我。然后,我将此生成器传递给一个函数,该函数对其进行迭代,并对每个项目进行一堆逻辑处理。然后,在该函数被调用之后,我想引用相同的生成器。但是,似乎生成器不再具有/生成任何项目。代码如下:

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
    }
}

4 个答案:

答案 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 protocolnext()方法)以有状态地迭代其生成器函数的控制流。

要解决您的问题,请通过返回生成器对象的单独实例,将生成器函数调用与一个实现可迭代协议的对象封装在一起,您可以使用相同的方式使用它:

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