for await ...
当在异步迭代器上当前迭代的计算依赖于一些先前的迭代时,就需要出现。如果没有依赖,Promise.all
就是你的选择。该for await
构造旨在与异步迭代器一起使用,尽管 - 在您的示例中,您可以将它与一系列Promise一起使用。
有关使用无法使用以下方法重写的异步迭代器的示例,请参阅javascript.info一书中的示例分页数据:Promise.all
(async () => {
for await (const commit of fetchCommits('javascript-tutorial/en.javascript.info')) {
console.log(commit.author.login);
}
})();
这里fetchCommits
异步迭代器向fetch
GitHub 存储库的提交发出请求。在fetch
与30个提交一个JSON响应,并且还提供了一个链接到下一个页面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;
}
}
}