微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在多个函数/方法中重用生成器

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

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

function* getFileGen(path: string){
  const fileContent = fs
  .readFileSync(path,{
    encoding: "utf-8",flag: "r",})
  .split("\n");

  while(true){
      const thisLine = fileContent.shift();
      if(!thisLine){
        break;
      }
      yield thisLine; 
  }
}

我想在其中使用生成器的两个函数

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行;但是当生成器传递给 getNextFew 函数时,它已经关闭了。

解决方法

来自docs

在 for...of 循环中,突然的迭代终止可能由 break、throw 或 return 引起。在这些情况下,迭代器关闭

而且,特别是:

不要重复使用生成器

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

强调我的。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。