繁体   English   中英

javascript中异步生成器的目的是什么?

[英]What's the purpose of asynchronous generators in javascript?

我正在阅读一本关于现代异步 Javascript 的书,作者曾写了一些代码来查询 Github 存储库并检索其所有过去的提交。

生成的数组一次为我们提供 30 次提交,响应标头为我们提供了指向包含其他结果的下一页的链接。

在书中,作者使用一个生成器函数来完成这样的任务:

    async function* generator(repo) {
      for (;;) {
        const response = await axios.get(repo, config);
        const data = response.data;
        for (let commit of data) {
          yield commit;
        }
        const link = response.headers.link;
        repo = /<(.*?)>; rel="next"/.exec(link)?.[1];
    
        if (repo === undefined) {
          // Breaking doesn't return anything, which means the iterator is done
          break;
        }
      }
    }

    async function getCommits(repo, maxData) {
      let i = 0;
      for await (const commit of generator(repo)) {
        console.log(`-------------repo: ${i}-----------------`);
        console.log(commit);
        if (i++ === maxData) {
          break;
        }
      }
    }

在试图理解生成器函数时,我最终重写了这段代码,就像我通常使用常规异步函数那样做:

    async function getCommits(url, numItems) {
      let i = 0;
    
      while (i <= numItems) {
        let commits = await axios.get(url, config);
        let data = commits.data;
        let nextUrl = /<(.*?)>; rel="next"/.exec(commits.headers.link)?.[1];
        for (let commit of data) {
          if (i > numItems) break;
          console.log(`-------------repo: ${i}-----------------`);
          console.log(commit);
          i++;
        }
        url = nextUrl;
      }
    }

我的代码似乎工作正常,而且似乎比使用生成器函数的版本更短。 我仍然不完全理解异步生成器的用例或者我为什么要使用它们。

如果有人可以解释或指出一些资源以了解更多信息,我会很高兴。

目的之一是抽象异步操作。 假设有一个库具有执行许多异步任务的功能。 虽然它可以指示库的用户自己执行迭代(例如使用您的第二个代码),但可以说为用户提供异步生成器会更好。

如果您实现一次生成器,则该生成器可以在需要的任何地方使用,而不必编写命令式迭代代码。

能够说更好

// Here's how you use this library
for await (const result of getResults()) {
  console.log(result);
}

// Here's how you use this library
let i = 0;
const resultsGetter = makeAllResultsGetter();
while (i <= numItems) {
  const result = await resultsGetter();
  console.log(result);
  i++;
}

您绝对不需要使用异步生成器,但您可能有一次遇到这样一种情况:您发现它们提供的逻辑模式是解决手头问题的最优雅方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM