Partilhar via


Efetuar loop e paginar os dados retornados do SDK do Azure para JavaScript

Ao trabalhar com serviços do Azure, muitas vezes você precisa processar grandes conjuntos de dados. O SDK do Azure para JavaScript fornece iteradores assíncronos para ajudar a gerenciar essa tarefa de forma eficiente. Este artigo explica o que são iteradores assíncronos, como usá-los e fornece exemplos para os principais serviços do Azure.

O que são iteradores assíncronos?

Os iteradores assíncronos são um recurso do JavaScript moderno que permite consumir dados de forma assíncrona. Eles são úteis para lidar com dados paginados de APIs. Os iteradores assíncronos usam o for-await-of loop para iterar os dados, buscando-os conforme necessário.

O uso de iteradores assíncronos oferece várias vantagens:

  • Sintaxe simplificada: O for-await-of loop torna o consumo de iteradores assíncronos simples.
  • Busca de dados sob demanda: Procure apenas os dados de que precisa, reduzindo o uso de memória e a carga no back-end.
  • Compatibilidade futura: Os iteradores assíncronos são um recurso padrão em JavaScript, garantindo compatibilidade com futuras atualizações e bibliotecas.

Se você é novo em iteradores assíncronos, os conceitos a seguir ajudam a entender como a paginação funciona nos SDKs do Azure para JavaScript.

  • Funções assíncronas: Funções que retornam um Promise.
  • Geradores: Funções que podem ser pausadas e retomadas, produzindo vários valores.
  • Geradores assíncronos: Combine os recursos de funções assíncronas e geradores para produzir iteradores assíncronos.

As bibliotecas de cliente do Azure usam iteradores assíncronos para lidar com coleções de dados potencialmente grandes. Abaixo estão exemplos de como usar iteradores assíncronos com vários serviços do Azure.

Percorrer alguns itens

Se o conjunto de resultados for apenas alguns itens, você poderá percorrer essa pequena lista. O código a seguir percorre um pequeno conjunto de contêineres no Armazenamento do Azure:

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

Iterar sobre dados por página

Se o conjunto de dados for maior, poderá retornar os dados em páginas e, em seguida, percorrer os itens em cada página. O código a seguir percorre os dados por página e, em seguida, cada item.

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 o ciclo

Se você precisar ter mais controle sobre o loop, incluindo retomar o loop, use um token de continuação. O iterador paginado também suporta retomar a partir de um token de continuação. No exemplo a seguir, usamos o token de continuação da primeira iteração para retomar a iteração na 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 adicionais