Поделиться через


Цикл и страница по данным, возвращаемым из пакета SDK Azure для JavaScript

При работе со службами Azure часто требуется обрабатывать большие наборы данных. Пакет SDK Azure для JavaScript предоставляет асинхронные итераторы для эффективного управления этой задачей. В этой статье объясняется, какие асинхронные итераторы используются и приведены примеры для ключевых служб Azure.

Что такое асинхронные итераторы?

Асинхронные итераторы — это функция в современном JavaScript, которая позволяет асинхронно использовать данные. Они полезны для обработки пагинированных данных из API-интерфейсов. Асинхронные итераторы используют цикл for-await-of для перебора данных, извлекая их по мере необходимости.

Использование асинхронных итераторов обеспечивает несколько преимуществ:

  • Упрощенный синтаксис: Цикл for-await-of упрощает использование асинхронных итераторов.
  • Получение данных по запросу: Извлеките только необходимые данные, уменьшая использование памяти и нагрузку на серверную часть.
  • Будущая совместимость: Асинхронные итераторы — это стандартная функция в JavaScript, обеспечивающая совместимость с будущими обновлениями и библиотеками.

Если вы не знакомы с асинхронными итераторами, следующие понятия помогают понять, как работает разбиение по страницам в пакетах SDK Azure для JavaScript.

  • Асинхронные функции: Функции, возвращающие 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}`
  );

Дополнительные ресурсы