Aracılığıyla paylaş


JavaScript için Azure SDK'dan döndürülen veriler üzerinde döngü yapma ve sayfalama yapma

Azure hizmetleriyle çalışırken genellikle büyük veri kümelerini işlemeniz gerekir. JavaScript için Azure SDK, bu görevi verimli bir şekilde yönetmenize yardımcı olmak amacıyla zaman uyumsuz yineleyiciler sağlar. Bu makalede zaman uyumsuz yineleyicilerin ne olduğu, bunların nasıl kullanılacağı açıklanır ve önemli Azure hizmetleri için örnekler sağlanır.

Zaman uyumsuz yineleyiciler nelerdir?

Zaman uyumsuz yineleyiciler, modern JavaScript'te verileri zaman uyumsuz olarak kullanmanıza olanak sağlayan bir özelliktir. API'lerden sayfalandırılmış verileri işlemek için kullanışlıdır. Asenkron yineleyiciler, verileri yinelemek ve gerektiğinde getirmek için for-await-of döngüsünü kullanır.

Asenkron yineleyiciler kullanmak çeşitli avantajlar sağlar.

  • Basitleştirilmiş Söz Dizimi:for-await-of döngüsü, async iteratörleri kullanmayı kolaylaştırır.
  • İsteğe Bağlı Veri Getirme: Yalnızca ihtiyacınız olan verileri getirerek arka uçta bellek kullanımını ve yüklemeyi azaltır.
  • Gelecekteki Uyumluluk: Zaman uyumsuz yineleyiciler JavaScript'te standart bir özelliktir ve gelecekteki güncelleştirmeler ve kitaplıklarla uyumluluk sağlar.

Zaman uyumsuz yineleyicilere yabancıysanız, aşağıdaki kavramlar JavaScript için Azure SDK'larında sayfalamanın nasıl çalıştığını anlamanıza yardımcı olur.

  • Zaman Uyumsuz İşlevler:Promise döndüren işlevler.
  • Jeneratör: Duraklatılıp sürdürülebilen ve birden çok değer veren işlevler.
  • Zaman Uyumsuz Oluşturucular: Zaman uyumsuz yineleyiciler üretmek için zaman uyumsuz işlevlerin ve oluşturucuların özelliklerini birleştirin.

Azure istemci kitaplıkları, büyük veri koleksiyonlarını işlemek için zaman uyumsuz yineleyiciler kullanır. Aşağıda, çeşitli Azure hizmetleriyle zaman uyumsuz yineleyicilerin nasıl kullanılacağına yönelik örnekler verilmiştir.

Birkaç öğeyi döngüye alma

Sonuç kümesi yalnızca birkaç öğeyse, bu küçük listede döngü yapabilirsiniz. Aşağıdaki kod, Azure Depolama'daki küçük bir kapsayıcı kümesinde döngü yapar:

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

Sayfa sayfa veri üzerinde döngü oluşturma

Veri kümeniz daha büyükse, verileri sayfalara döndürmek ve ardından her sayfadaki öğeler üzerinde yineleme yapmak isteyebilirsiniz. Aşağıdaki kod, veriyi sayfa sayfa döngüden geçirir ve ardından her öğeyi iterasyona tabi tutar.

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

Döngüye devam et

Döngünün sürdürülmesi de dahil olmak üzere döngü üzerinde daha fazla denetime sahip olmanız gerekiyorsa bir devamlılık belirteci kullanın. Sayfalandırılmış yineleyici, devam belirtecinden sürdürmeyi de destekler. Aşağıdaki örnekte, ikinci sayfada yinelemeyi sürdürmek için ilk yinelemeden devam belirtecini kullanırız.

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

Ek kaynaklar