簡體   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