Dela via


Loopa och bläddra genom data som returneras från Azure SDK för JavaScript

När du arbetar med Azure-tjänster behöver du ofta bearbeta stora datamängder. Azure SDK för JavaScript tillhandahåller asynkrona iteratorer som hjälper dig att hantera den här uppgiften effektivt. Den här artikeln förklarar vad asynkrona iteratorer är, hur du använder dem och innehåller exempel på viktiga Azure-tjänster.

Vad är asynkrona iteratorer?

Asynkrona iteratorer är en funktion i modern JavaScript som gör att du kan använda data asynkront. De är användbara för att hantera sidnumrerade data från API:er. Asynkrona iteratorer använder loopen for-await-of för att iterera över data och hämtar den efter behov.

Att använda asynkrona iteratorer ger flera fördelar:

  • Förenklad syntax: Loopen for-await-of gör det enkelt att använda asynkrona iteratorer.
  • Datahämtning på begäran: Hämta endast de data du behöver, vilket minskar minnesanvändningen och belastningen på serverdelen.
  • Framtida kompatibilitet: Asynkrona iteratorer är en standardfunktion i JavaScript, vilket säkerställer kompatibilitet med framtida uppdateringar och bibliotek.

Om du är nybörjare på de asynkrona iteratorer kan följande begrepp hjälpa dig att förstå hur paginering fungerar i Azure SDK för JavaScript.

  • Async Functions: Funktioner som returnerar en Promise.
  • Generatorer: Funktioner som kan pausas och återupptas, vilket ger flera värden.
  • Asynkrona generatorer: Kombinera funktionerna i asynkrona funktioner och generatorer för att skapa asynkrona iteratorer.

Azure-klientbibliotek använder asynkrona iteratorer för att hantera potentiellt stora datasamlingar. Nedan visas exempel på hur du använder asynkrona iteratorer med olika Azure-tjänster.

Loopa över några objekt

Om resultatuppsättningen bara är ett fåtal objekt kan du gå igenom den lilla listan. Följande kod loopar via en liten uppsättning containrar i Azure Storage:

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

Loopa över data efter sida

Om datamängden är större kanske du vill returnera data på sidor och sedan iterera över objekt på varje sida. Följande kod loopar genom data sida för sida och sedan genom varje objekt.

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

Fortsätt loopa

Om du behöver ha mer kontroll över loopen, inklusive att återuppta loopen, använder du en fortsättningstoken. Den sidsidiga iteratorn stöder också återupptagande från en fortsättningstoken. I följande exempel använder vi fortsättningstoken från den första iterationen för att återuppta iterationen på den andra sidan.

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

Ytterligare resurser