JavaScript
Promise.allSettled
Tüm promise'lar sonlanana kadar bekleyip her birinin sonucunu öğrenirsin.
Promise.allSettled
Promise.allSettled, kendisine verilen tüm promise'lar yerleşene (settle) kadar bekler. Bir promise reddedilse bile vazgeçmez; diğerlerini yine de tamamlar. Sonuç, her promise için bir nesne dizisidir: { status: 'fulfilled', value } ya da { status: 'rejected', reason }.
const results = await Promise.allSettled([
fetch('/users'),
fetch('/products')
]);
Birden çok API çağrısından bazıları başarısız olsa bile geri kalan sonuçları kaybetmezsin; her birini tek tek inceleyip başarılı olanları ayıklayabilirsin.
Sonuçları filtreleme
Her sonuç nesnesinin bir status özelliği vardır. 'fulfilled' ise value'yu, 'rejected' ise reason''u okursun. Başarılı sonuçları almak için diziyi .filter ile gezersin.
const ok = results.filter(r => r.status === 'fulfilled');
const values = ok.map(r => r.value);
Bu desen, kısmi başarılı toplu işlemlerde çok işe yarar: hangi çağrının geçtiğini, hangisinin geçemediğini ayrı ayrı görebilirsin.
Uygulama Başarılı çağrıları ayıkla
Üç promise tanımla: p1 ve p3 Promise.resolve ile bir değer döndürsün, p2 Promise.reject ile reddedilsin. Promise.allSettled ile üçünü birlikte bekle. Sonuçlardan yalnızca status === 'fulfilled' olanları .filter ile ayıkla ve console.log ile değerlerini yazdır.
Örnek çözümü göster
const p1 = Promise.resolve('user-1');
const p2 = Promise.reject('offline');
const p3 = Promise.resolve('user-3');
const results = await Promise.allSettled([p1, p2, p3]);
const ok = results.filter(r => r.status === 'fulfilled');
console.log(ok.map(r => r.value));
Kendini test et
-
Promise.all ile Promise.allSettled arasındaki temel fark nedir?
- İkisi de tamamen aynı şekilde davranır
- allSettled her zaman daha hızlıdır
- allSettled reddedilenleri de sonuçlara dahil eder
- Promise.all tüm sonuçları döndürür
Cevabı göster
allSettled reddedilenleri de sonuçlara dahil eder — Doğru! allSettled reddedilen promise'ları da { status: 'rejected' } olarak sonuca ekler.
-
Sonuç durumunu denetle
const r = await Promise.allSettled([p1, p2]);
if (r[0].____ === 'fulfilled') {
console.log(r[0].value);
}
Cevabı göster
const r = await Promise.allSettled([p1, p2]);
if (r[0].status === 'fulfilled') {
console.log(r[0].value);
}
-
Promise metodlarını eşleştir
- allSettled
- tümü yerleşir
- all
- ilk reddedilende durur
- race
- ilk yerleşeni alır
- any
- ilk başarılıyı alır
Sıradaki ders: Promise.any