Frontend Development

Asenkron JS Kalıplarını Ustalıkla Kullanma

Asenkron programlama, modern web geliştirmenin omurgasıdır. Temel promise'lar ve async/await sözdizimi standart hale gelse de, gerçek dünya uygulamaları genellikle yürütme akışı, hata dayanıklılığı ve kaynak yönetimi üzerinde daha sofistike kontroller gerektirir. Bu kılavuzda, temel işlevsellik ile üretim kalitesinde dayanıklılık arasındaki boşluğu dolduran gelişmiş asenkron kalıpları keşfedeceğiz.

1. Toplu İşleme ile Eşzamanlılık Kontrolü

Ön yüz geliştirmede en yaygın hatalardan biri, aynı anda yüzlerce API isteği göndermektir. Bu durum sunucuyu aşırı yükleyebilir, kullanıcının bant genişliğini tüketebilir veya hız sınırlama hatalarına neden olabilir. Bunu önlemek için bir eşzamanlılık sınırlayıcısı uygulayacağız. Bu yardımcı program, herhangi bir anda yalnızca belirli sayıda promise'nin aktif olmasını sağlar.

İşte eşzamanlılık kontrollü bir çalıştırıcı için pratik bir uygulama:

function runConcurrently(tasks, limit) {
  const results = [];
  let index = 0;

  function next() {
    if (index >= tasks.length) return Promise.resolve();
    
    const currentIndex = index;
    index++;
    
    return tasks[currentIndex]().then((result) => {
      results[currentIndex] = result;
      return next();
    });
  }

  // 'limit' kadar işçi havuzu oluştur
  const workers = Array.from({ length: limit }, () => next());
  
  return Promise.all(workers).then(() => results);
}

// Kullanım örneği
const tasks = [
  () => fetch('/api/data-1').then(r => r.json()),
  () => fetch('/api/data-2').then(r => r.json()),
  () => fetch('/api/data-3').then(r => r.json()),
];

runConcurrently(tasks, 2) // Sadece 2 eşzamanlı istek
  .then(console.log);

Bu kalıp, daha pürüzsüz kullanıcı deneyimleri ve daha iyi sunucu kararlılığı sağlayarak, toplu işler halinde getirilmesi gereken büyük veri setleriyle çalışırken paha biçilemezdir.

2. Sağlam Hata Yönetimi Stratejileri

Varsayılan promise reddetme yayılımı, karmaşık asenkron zincirlerde zorlu olabilir. Yaygın bir gereksinim, tüm süreci durdurmadan hataları zarifçe yönetmektir; örneğin, bazı görevler başarısız olsa bile devam etmek istediğiniz "yumuşak" bir başarısızlık senaryosunda.

Promiseleri tek tek hataları yakalayacak şekilde sararak başarılı sonuçları koruyan bir yardımcı program oluşturabiliriz:

function safeExecute(fn) {
  return fn().then(
    (data) => ({ success: true, data }),
    (error) => ({ success: false, error })
  );
}

async function processWithResilience(tasks) {
  // Her görevi güvenli bir yürütme sarmalayıcısına dönüştür
  const wrappedTasks = tasks.map(safeExecute);
  
  // Tüm görevleri eşzamanlı olarak çalıştır
  const results = await Promise.all(wrappedTasks);
  
  // Başarılı olanları başarısızlardan ayır
  const successes = results.filter(r => r.success).map(r => r.data);
  const failures = results.filter(r => !r.success).map(r => r.error);
  
  return { successes, failures };
}

Bu yaklaşım, geliştiricilerin uygulamayı çökertmeden yeniden deneme mantığı, yedek kullanıcı arayüzü durumları veya günlük mekanizmaları uygulamasına olanak tanır.

3. Özel Asenkron Yinelenebilirler Oluşturma

ES2018, for await...of döngülerini kullanmamıza olanak tanıyan asenkron yinelenebilirleri tanıttı. Bu, bellek kullanımının bir sorun olduğu akış verileri veya büyük diziler üzerinde işlem yapma için mükemmeldir. Tüm verileri belleğe yüklemek yerine, parça parça işleyebiliriz.

async function* generateStream(items) {
  for (const item of items) {
    yield item;
    // Asenkron işlemi veya gecikmeyi simüle et
    await new Promise(resolve => setTimeout(resolve, 100));
  }
}

// Kullanım
async function processLargeDataset() {
  const data = Array.from({ length: 1000 }, (_, i) => i);
  for await (const item of generateStream(data)) {
    console.log(`İşlendi: ${item}`);
  }
}

Her öğeden sonra kontrolü olay döngüsüne geri vererek ana iş parçacığının bloklanmasını önleriz; bu da ağır yük altında bile daha duyarlı bir uygulama sonuçlanır.

Sonuç

Gelişmiş asenkron kalıpları ustalıkla kullanmak, JavaScript uygulamalarındaki karmaşıklıkla nasıl başa çıktığınızı dönüştürür. Eşzamanlılık kontrolü uygulayarak altyapınızı korursunuz. Sağlam hata yönetimini benimseyerek kararlılığı sağlarsınız. Ve asenkron yinelenebilirlerden yararlanarak performansı optimize edersiniz. Bu teknikler sadece teorik kavramlar değil; ölçeklenebilir, sürdürülebilir ve yüksek performanslı ön yüz uygulamaları oluşturmak için temel araçlardır. Kod kalitenizi ve geliştirme iş akışınızı yükseltmek için bu kalıpları bir sonraki projenize entegre etmeye başlayın.

Share: