Javascript 在多个函数/方法中重用生成器

Javascript 在多个函数/方法中重用生成器,javascript,typescript,ecmascript-6,iterator,generator,Javascript,Typescript,Ecmascript 6,Iterator,Generator,我正在尝试创建一个文件读取器对象(从readFileSync)并从生成器函数中为行提供服务。我的意图是将这个gnerator对象传递给多个函数,并依次解析一个文件。但是,在单一功能中使用发电机后,发电机的状态将从暂停变为关闭。我来自Python背景,这是Python中非常可能的操作。我想知道我做错了什么。以下是我使用的代码: 生成器函数定义(我使用的是readFileSync,它不是异步的,请暂时忽略这一点,因为我正在尝试让生成器工作): 我想在其中使用生成器的两个功能: function ge

我正在尝试创建一个文件读取器对象(从readFileSync)并从生成器函数中为行提供服务。我的意图是将这个gnerator对象传递给多个函数,并依次解析一个文件。但是,在单一功能中使用发电机后,发电机的状态将从暂停变为关闭。我来自Python背景,这是Python中非常可能的操作。我想知道我做错了什么。以下是我使用的代码:

生成器函数定义(我使用的是readFileSync,它不是异步的,请暂时忽略这一点,因为我正在尝试让生成器工作):

我想在其中使用生成器的两个功能:

function getFirstFew(stream: Generator){
  let i = 0;
  for(let v of stream){
    console.log(v);
    if(i > 1){
      break;
    }
    i++;
  }
}

function getNextFew(stream: Generator){
  let i = 0;
  for(let v of stream){
    console.log(v);
    if(i > 7){
      break;
    }
    i++;
  }
最后创建一个生成器,并按顺序将其传递给两个函数,以打印多行:

const myStream = getFileGen('path/to/file');

getFirstFew(myStream);
getNextFew(myStream);
第一个函数正确执行并打印3行;但是,当生成器传递给GetNextNew函数时,它已经关闭。

来自:

在for…of循环中,突然的迭代终止可能是由中断、抛出或返回引起的。在这些情况下,迭代器关闭

具体而言:

不要重复使用生成器

生成器不应重复使用,即使for…of循环提前终止,例如通过break关键字。退出循环后,生成器将关闭,再次尝试对其进行迭代不会产生任何进一步的结果

我的

不过我承认,我对JS不是很在行,所以我不能推荐类似的解决方法。您可能需要使用一个列表或另一个您有更多控制权的严格结构

您可以实现与Python的
tee
类似的
tee
函数,该函数创建迭代器的副本,然后迭代其中一个副本。

来自:

在for…of循环中,突然的迭代终止可能是由中断、抛出或返回引起的。在这些情况下,迭代器关闭

具体而言:

不要重复使用生成器

生成器不应重复使用,即使for…of循环提前终止,例如通过break关键字。退出循环后,生成器将关闭,再次尝试对其进行迭代不会产生任何进一步的结果

我的

不过我承认,我对JS不是很在行,所以我不能推荐类似的解决方法。您可能需要使用一个列表或另一个您有更多控制权的严格结构


您可以实现一个类似于Python的
tee
函数的
tee
,该函数创建迭代器的副本,然后迭代其中一个副本。

谢谢您的回答。事实上,在我看你的答案之前,我怀疑,for of应该是问题所在,并使用了类似while(line=this.stream.next().value){…//line}的东西,它在不终止生成器的情况下工作。@c00der使用这个想法,您可以创建一个
take\n
函数,从迭代器中提取
n
对象并返回它们。如果我是你的话,我会找几个帮手。这听起来像是一个寒冷的下午的迷你项目。这将是一个很酷的主意。我会试一试的。实际上,在我正在实现的it版本中,只有一个函数处理文件的几行,其余的由另一个函数处理。谢谢你的回答。事实上,在我看你的答案之前,我怀疑,for of应该是问题所在,并使用了类似while(line=this.stream.next().value){…//line}的东西,它在不终止生成器的情况下工作。@c00der使用这个想法,您可以创建一个
take\n
函数,从迭代器中提取
n
对象并返回它们。如果我是你的话,我会找几个帮手。这听起来像是一个寒冷的下午的迷你项目。这将是一个很酷的主意。我会试一试的。实际上,在我正在实现的it版本中,只有一个函数处理文件的几行,其余的由另一个函数处理。
const myStream = getFileGen('path/to/file');

getFirstFew(myStream);
getNextFew(myStream);