Compartir a través de


Bucle y página sobre datos devueltos desde Azure SDK para JavaScript

Al trabajar con servicios de Azure, a menudo es necesario procesar grandes conjuntos de datos. El SDK de Azure para JavaScript proporciona iteradores asincrónicos para ayudar a administrar esta tarea de forma eficaz. En este artículo se explica qué son los iteradores asincrónicos, cómo usarlos y se proporcionan ejemplos para los servicios clave de Azure.

¿Qué son los iteradores asincrónicos?

Los iteradores asincrónicos son una característica de JavaScript moderno que permite consumir datos de forma asincrónica. Son útiles para controlar los datos paginados de las API. Los iteradores asincrónicos usan el for-await-of bucle para recorrer en iteración los datos y capturarlos según sea necesario.

El uso de iteradores asincrónicos proporciona varias ventajas:

  • Sintaxis simplificada: El for-await-of bucle hace que el consumo de iteradores asincrónicos sea sencillo.
  • Captura de datos a petición: Capture solo los datos que necesita, lo que reduce el uso de memoria y la carga en el back-end.
  • Compatibilidad futura: Los iteradores asincrónicos son una característica estándar en JavaScript, lo que garantiza la compatibilidad con futuras actualizaciones y bibliotecas.

Si no está familiarizado con iteradores asincrónicos, los siguientes conceptos le ayudarán a comprender cómo funciona la paginación en los SDK de Azure para JavaScript.

  • Funciones asincrónicas: Funciones que devuelven un Promise.
  • Generadores: Funciones que se pueden pausar y reanudar, lo que produce varios valores.
  • Generadores asincrónicos: Combine las características de las funciones asincrónicas y los generadores para generar iteradores asincrónicos.

Las bibliotecas cliente de Azure usan iteradores asincrónicos para controlar colecciones de datos potencialmente grandes. A continuación se muestran ejemplos de cómo usar iteradores asincrónicos con varios servicios de Azure.

Bucle sobre unos pocos elementos

Si el conjunto de resultados tiene solo unos pocos elementos, puede recorrer esa pequeña lista. El código siguiente recorre en bucle un pequeño conjunto de contenedores en Azure Storage:

for await (const container of blobServiceClient.listContainers()) {
  console.log(`Container: ${container.name}`);
}

Recorrer datos por página

Si el conjunto de datos es mayor, es posible que desee devolver los datos en páginas y, a continuación, iterar sobre los elementos de cada página. El código siguiente recorre en bucle los datos por página y, a continuación, cada elemento.

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

Continuar iterando

Si necesita tener más control sobre el bucle, incluida la reanudación del bucle, use un token de continuación. El iterador paginado también admite la reanudación desde un token de continuación. En el ejemplo siguiente, se usa el token de continuación de la primera iteración para reanudar la iteración en la segunda página.

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

Recursos adicionales