for await ...
当在异步迭代器上当前迭代的计算依赖于一些先前的迭代时,就会出现需要。如果没有依赖,Promise.all
是你的选择。该for await
构造旨在与异步迭代器一起使用,尽管 - 就像在您的示例中一样,您可以将它与一组承诺一起使用。
有关使用无法重写的异步迭代器的示例,请参见javascript.info书中的示例分页数据:Promise.all
(async () => {
for await (const commit of fetchCommits('javascript-tutorial/en.javascript.info')) {
console.log(commit.author.login);
}
})();
在这里,异步迭代器向GitHub 存储库的提交fetchCommits
发出请求。fetch
以 30 次提交的JSON 响应,并在标题fetch
中提供指向下一页的链接。因此下一次迭代只能在上一次迭代有下一个请求的链接之后开始Link
async function* fetchCommits(repo) {
let url = `https://api.github.com/repos/${repo}/commits`;
while (url) {
const response = await fetch(url, {
headers: {'User-Agent': 'Our script'},
});
const body = await response.json(); // (array of commits
// The URL of the next page is in the headers, extract it using a regexp
let nextPage = response.headers.get('Link').match(/<(.*?)>; rel="next"/);
nextPage = nextPage?.[1];
url = nextPage;
for(let commit of body) { // yield commits one by one, until the page ends
yield commit;
}
}
}