Foruma hoş geldin 👋, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Promise.allSettled() ile Hatalı Promise'ları da Yakalayarak Tüm Asenkron İşlem Sonuçlarını Alma Yöntemim

thedevx

Üye
Katılım
14 Mart 2026
Mesajlar
36
Merhaba arkadaşlar, bugün başımı çok ağrıtan bir sorunu ve nasıl temiz bir çözüm bulduğumu anlatacağım. Birden fazla API'ye aynı anda istek atmam gereken bir senaryoda, bir tanesi bile hata verse tüm işlem duruyor ve diğerlerinden gelen verileri de kaybediyordum. Bu hatayı ilk gördüğümde kafayı yemiştim! Ta ki 🔥 Promise.allSettled() ile tanışana kadar.

⚙️ Klasik Promise.all()'ın Derdi
Hepimizin aşina olduğu Promise.all() mükemmel gibi görünür, ancak içindeki promise'lardan biri reject edilirse, tüm zincir o noktada patlar. Geri kalan tüm sonuçlar uçup gider. Örneğin 3 farklı kullanıcı verisi çekiyorsanız ve 2.si 404 hatası verirse, 1. ve 3. kullanıcının verilerini de alamazsınız.

JavaScript:
// Klasik yöntem - Biri hata verirse hepsi durur!
const userIds = [1, 2, 3, 999]; // 999 ID'li kullanıcı olmayabilir

const userPromises = userIds.map(id => fetch(`/api/user/${id}`).then(r => r.json()));

Promise.all(userPromises)
  .then(users => console.log('Tüm kullanıcılar:', users)) // 999 hata verirse buraya hiç ulaşamaz
  .catch(error => console.error('Bir hata oluştu:', error)); // Sadece 999'un hatasını görürüz, 1,2,3 kaybolur

İşte benim kullandığım en temiz çözüm ✅ Promise.allSettled() devreye giriyor. Bu metod, tüm promise'lar işini bitirene (settled) -yani başarılı (fulfilled) ya da başarısız (rejected) olsun fark etmez- bekler. Sonra hepsinin sonucunu bir dizi olarak döndürür.

📦 Promise.allSettled() ile Sağlam Çözüm
Bu metodun dönüş değeri çok şıktır. Her bir sonuç için bir obje döner. Bu objenin status değeri ya "fulfilled" ya da "rejected" olur. Başarılı olanlarda value, başarısız olanlarda ise reason (sebep) anahtarı bulunur.

JavaScript:
const userIds = [1, 2, 3, 999];

const userPromises = userIds.map(id =>
  fetch(`/api/user/${id}`)
    .then(response => {
      if (!response.ok) throw new Error(`HTTP ${response.status}`);
      return response.json();
    })
);

Promise.allSettled(userPromises)
  .then(results => {
    console.log('Tüm işlemler tamamlandı! Sonuçlar:');

    const successfulUsers = [];
    const errors = [];

    results.forEach((result, index) => {
      if (result.status === 'fulfilled') {
        console.log(`✅ ID ${userIds[index]} başarılı:`, result.value);
        successfulUsers.push(result.value);
      } else {
        console.log(`❌ ID ${userIds[index]} başarısız:`, result.reason.message);
        errors.push({ id: userIds[index], error: result.reason });
      }
    });

    console.log('Başarılı sonuçlar:', successfulUsers);
    console.log('Hatalar:', errors);
    // Artık successfulUsers dizisiyle ve errors dizisiyle istediğinizi yapabilirsiniz.
  });

💡 Gerçek Hayat Senaryosu ve İnce Ayar
Ben bu yöntemi, kullanıcıya bir dashboard'da birbirinden bağımsız 5-6 farklı widget'ın verisini aynı anda yüklerken kullanıyorum. Bir widget'ın API'si geçici olarak down olsa bile, diğer widget'lar çalışmaya ve verilerini göstermeye devam ediyor. Hata alan widget'a ise "Şu an veri alınamıyor" gibi bir uyarı koyuyorum. Kullanıcı deneyimi mükemmel oluyor!

Sonuç olarak, Promise.allSettled(), özellikle birbirinden bağımsız ve hepsinin sonucunu görmek istediğiniz paralel işlemlerde vazgeçilmez bir araç. Siz de Promise.all() kullanırken "ya biri hata verirse" diye endişeleniyor musunuz? Bu framework'te (React, Vue, Node.js fark etmez) aynı sorunu yaşadınız mı? Sizin kullandığınız farklı bir yöntem veya kütüphane var mı? Yorumlarda paylaşalım!
 

Tema özelleştirme sistemi

Bu menüden forum temasının bazı alanlarını kendinize özel olarak düzenleye bilirsiniz.

Zevkine göre renk kombinasyonunu belirle

Tam ekran yada dar ekran

Temanızın gövde büyüklüğünü sevkiniz, ihtiyacınıza göre dar yada geniş olarak kulana bilirsiniz.

Geri