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.
İş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.
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!
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
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.
});
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!