使用 Azure 服务时,通常需要处理大量数据集。 用于 JavaScript 的 Azure SDK 提供异步迭代器来帮助高效管理此任务。 本文介绍什么是异步迭代器、如何使用异步迭代器,并提供关键 Azure 服务的示例。
什么是异步迭代器?
异步迭代器是新式 JavaScript 中的一项功能,可用于异步使用数据。 它们可用于处理 API 中的分页数据。 异步迭代器使用 for-await-of
循环遍历数据,按需提取数据。
使用异步迭代器提供以下几个优势:
- 简化的语法: 该
for-await-of
循环使使用异步迭代器非常简单。 - 按需数据提取: 仅提取所需的数据,减少后端的内存使用率和负载。
- 将来的兼容性: 异步迭代器是 JavaScript 中的标准功能,可确保与将来的更新和库兼容。
如果你不熟悉异步迭代器,以下概念有助于了解分页在适用于 JavaScript 的 Azure SDK 中的工作原理。
- 异步函数: 返回
Promise
. 的函数 - 发电机: 可以暂停和恢复的函数,从而生成多个值。
- 异步生成器: 合并异步函数和生成器的功能以生成异步迭代器。
Azure 客户端库使用异步迭代器来处理潜在的大量数据集合。 下面是如何将异步迭代器用于各种 Azure 服务的示例。
循环访问几个元素
如果结果集只有几个项,则可以循环访问该小列表。 以下代码循环访问 Azure 存储中的一小部分容器:
for await (const container of blobServiceClient.listContainers()) {
console.log(`Container: ${container.name}`);
}
按页遍历数据
如果数据集较大,可能需要返回页面中的数据,然后循环访问每页中的项。 以下代码逐页循环访问数据,然后循环访问每个项。
const firstPage = await blobServiceClient.listContainers().byPage().next();
const continuationToken = firstPage.value.continuationToken;
// The iterator also supports iteration by page.
for await (const page of blobServiceClient
.listContainers()
.byPage({ continuationToken })) {
if (page.containerItems) {
for (const container of page.containerItems) {
console.log(`Container: ${container.name}`);
}
}
}
继续循环
如果需要更好地控制循环(包括恢复循环),请使用继续标记。 分页迭代器还支持从延续令牌恢复。 在以下示例中,我们使用第一次迭代中的延续标记在第二页继续迭代。
console.log('Starting to process pages...');
let processingComplete = false;
let pageNumber = 1;
try {
let page = undefined;
let continuationToken = undefined;
do {
// Get a page of results
page = await blobServiceClient.listContainers().byPage().next();
// Get the continuation token from the current page
continuationToken = page?.value?.continuationToken;
console.log(
`Processing page ${pageNumber}, items ${page.value.containerItems?.length || 0} with continuation token: ${continuationToken || 'none'}`
);
console.log(page.value);
// Scenario to continue paging:
// Perform an operation on the current page results
// if the operation returns true, stop processing
processingComplete = await fakeProcessor(page.value);
if (processingComplete) {
console.log('Stopping processing.');
break;
}
console.log(
`Processing complete for page ${pageNumber++}: get next page if a continuation token exists`
);
} while (continuationToken && !processingComplete);
console.log(
`Finished processing. Total pages processed: ${pageNumber - 1}`
);