Udostępnij za pomocą


Iteruj i przechodź przez dane zwracane z zestawu SDK Azure dla JavaScript

Podczas pracy z usługami platformy Azure często trzeba przetwarzać duże zestawy danych. Zestaw Azure SDK dla języka JavaScript udostępnia iteratory asynchroniczne ułatwiające efektywne zarządzanie tym zadaniem. W tym artykule wyjaśniono, czym są iteratory asynchroniczne, jak ich używać, oraz przedstawiono przykłady kluczowych usług platformy Azure.

Co to są asynchroniczne iteratory?

Iteratory asynchroniczne to funkcja nowoczesnego języka JavaScript, która umożliwia asynchroniczne korzystanie z danych. Są one przydatne do obsługi danych podzielonych na strony z interfejsów API. Iteratory asynchroniczne używają for-await-of pętli do iteracji danych, pobierając je zgodnie z potrzebami.

Korzystanie z iteratorów asynchronicznych zapewnia kilka zalet:

  • Uproszczona składnia: Pętla for-await-of sprawia, że korzystanie z iteratorów asynchronicznych jest proste.
  • Pobieranie danych na żądanie: Pobieraj tylko potrzebne dane, zmniejszając użycie pamięci i obciążenie zaplecza.
  • Zgodność w przyszłości: Iteratory asynchroniczne są standardową funkcją języka JavaScript, zapewniając zgodność z przyszłymi aktualizacjami i bibliotekami.

Jeśli dopiero zaczynasz korzystać z iteratorów asynchronicznych, poniższe pojęcia pomagają zrozumieć, jak działa stronicowanie w zestawach AZURE SDK dla języka JavaScript.

  • Funkcje asynchroniczne: Funkcje zwracające element Promise.
  • Generatory: Funkcje, które można wstrzymać i wznowić, co daje wiele wartości.
  • Generatory asynchroniczne: Połącz funkcje funkcji asynchronicznych i generatorów, aby tworzyć iteratory asynchroniczne.

Biblioteki klienckie platformy Azure używają iteratorów asynchronicznych do obsługi potencjalnie dużych kolekcji danych. Poniżej przedstawiono przykłady używania iteratorów asynchronicznych z różnymi usługami platformy Azure.

Iterowanie przez kilka elementów

Jeśli zestaw wyników to tylko kilka elementów, możesz wykonać pętlę za pomocą tej małej listy. Poniższy kod przebiega przez niewielki zbiór kontenerów w usłudze Azure Storage.

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

Iteracja po danych na stronach

Jeśli zestaw danych jest większy, możesz zwrócić dane w stronach, a następnie iterować po elementach na każdej stronie. Poniższy kod przegląda dane strona po stronie, a następnie każdy element.

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

Kontynuuj pętlę

Jeśli potrzebujesz większej kontroli nad pętlą, w tym wznowienia pętli, użyj tokenu kontynuacji. Iteracje stronicowane obsługują również wznawianie za pomocą tokenu kontynuacji. W poniższym przykładzie użyjemy tokenu kontynuacji z pierwszej iteracji, aby wznowić iterację na drugiej stronie.

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

Dodatkowe zasoby