JavaScript

Promise.all vs Promise.allSettled

Ketika kita menjalankan beberapa promise sekaligus, ada dua cara umum untuk menunggu semuanya selesai. Keduanya kelihatan mirip, tapi perilakunya ketika ada yang gagal sangat berbeda.

Promise.all menunggu semua promise berhasil. Bila salah satu saja gagal, dia langsung berhenti dan melempar error pertama yang muncul, lalu hasil dari promise lain yang sebenarnya berhasil ikut hilang.

JS
try {
  const hasil = await Promise.all([
    fetch('/api/user'),
    fetch('/api/salah-url'), // gagal
    fetch('/api/posts'),
  ]);
} catch (err) {
  // langsung masuk sini, hasil /api/user dan /api/posts tidak kita dapat
}

Promise.allSettled menunggu semuanya selesai, entah berhasil atau gagal, lalu memberi tahu status masing-masing. Tidak ada yang dilempar, kita dapat laporan lengkapnya.

JS
const hasil = await Promise.allSettled([
  fetch('/api/user'),
  fetch('/api/salah-url'),
  fetch('/api/posts'),
]);

hasil.forEach((r) => {
  if (r.status === 'fulfilled') console.log('Berhasil:', r.value);
  else console.log('Gagal:', r.reason);
});

Aturan gampangnya, pakai Promise.all bila semuanya wajib berhasil dan satu kegagalan berarti semua batal, misal memuat data yang saling bergantung. Pakai Promise.allSettled bila kamu ingin tetap memproses yang berhasil walaupun sebagian gagal, misal menampilkan beberapa widget dashboard yang berdiri sendiri.