对从适用于 JavaScript 的 Azure SDK 返回的数据进行循环和翻页

使用 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}`
  );

其他资源