Promise.all, Promise.allSettled, Promise.race ve Promise.any arasındaki fark nedir?

Cevap

Dördü de birden fazla promise'i birleştirir; fark, ne zaman tamamlandıkları ve hatayı nasıl ele aldıklarıdır.

MetotNe zaman resolve olurNe zaman reject olur
Promise.allHepsi başarılı olunca (sonuç dizisi)İlk hata anında
Promise.allSettledHepsi bitince (başarılı veya hatalı)Hiçbir zaman
Promise.raceİlk biten başarılıysaİlk biten hatalıysa
Promise.anyİlk başarılı olanHepsi hatalıysa (AggregateError)
const [user, orders] = await Promise.all([
  getUser(id),
  getOrders(id),
]); // biri hata verirse catch'e düşer

const results = await Promise.allSettled(urls.map((u) => fetch(u)));
const ok = results.filter((r) => r.status === "fulfilled").map((r) => r.value);

// timeout kalıbı
const data = await Promise.race([
  fetch(url),
  new Promise((_, rej) => setTimeout(() => rej(new Error("timeout")), 2000)),
]);

// en hızlı yanıt veren mirror
const fastest = await Promise.any([fetch(m1), fetch(m2), fetch(m3)]);

Önemli noktalar

  • Promise.all ilk hatada reject olur ama diğer işleri iptal etmez; arka planda çalışmaya devam ederler. İptal için AbortController kullanın. Modern Node.js'te timeout için AbortSignal.timeout(2000) daha temizdir.
  • Sıralı await ile paralel çalışma farkı:
const a = await getA();  // 100ms
const b = await getB();  // 100ms  -> toplam 200ms

const [a2, b2] = await Promise.all([getA(), getB()]); // toplam yaklaşık 100ms
  • Binlerce işi tek Promise.all ile başlatmak DB'yi veya dış API'yi boğabilir; p-limit gibi bir araçla eşzamanlılığı sınırlayın.
  1. cluster modülü ile worker_threads arasındaki fark nedir? Hangisini ne zaman kullanırsınız?ZorNode.jsBackend
  2. Node.js event loop'u nasıl çalışır? libuv'nin rolü ve event loop aşamaları nelerdir?ZorNode.jsBackend
  3. Node.js'te asenkron kodda hata yönetimi nasıl yapılır? unhandledRejection nedir?OrtaNode.jsBackend
  4. Node.js'te stream nedir? Türleri nelerdir ve backpressure ne demektir?OrtaNode.jsBackend
  5. process.nextTick, Promise.then, setImmediate ve setTimeout(fn, 0) hangi sırayla çalışır?OrtaNode.jsBackend
  6. Express.js'te middleware nedir ve nasıl çalışır?KolayNode.jsBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle