← Kembali ke kursus
Pelajaran kursus · JavaScript
Pelajaran 32

Promise: then/catch/finally

Chaining, error handling, Promise.all/race/allSettled.

Pahami konsepnya

Promise adalah objek yang mewakili nilai yang BELUM tersedia tapi akan tiba: new Promise((resolve, reject) => { ... }). resolve(nilai) memenuhi janji; reject(error) menolaknya. Konsumennya: .then(hasil), .catch(error), .finally(selalu).

Chaining: .then mengembalikan Promise baru sehingga bisa dirantai: fetchData().then(d => proses(d)).then(h => simpan(h)).catch(e => log(e)).finally(() => cleanup()). Satu catch di akhir menangkap error dari seluruh rantai.

Promise.all([p1, p2, p3]) menunggu SEMUA selesai — hasil array berurutan; satu gagal, semuanya gagal. Promise.race memberi yang PERTAMA selesai (sukses atau gagal). Promise.allSettled menunggu semua selesai APA PUN hasilnya — array {status, value/reason}. Promise.any memberi yang pertama BERHASIL.

Coba contoh kode

// Promise dasar
const ambilData = new Promise((resolve, reject) => {
  const sukses = true;
  if (sukses) resolve({ nama: "Ari", umur: 17 });
  else reject(new Error("gagal mengambil"));
});

ambilData
  .then(d => `${d.nama} (${d.umur})`)
  .then(teks => console.log(teks))
  .catch(e => console.error(e.message));

// Promise.all
const p1 = Promise.resolve(10);
const p2 = Promise.resolve(20);
Promise.all([p1, p2]).then(([a, b]) => console.log(a + b));  // 30

Rantai then mengalirkan hasil: resolve({nama,umur}) → then pertama mengubah jadi string → then kedua mencetak. Promise.all menunggu dua resolve lalu mendestruksi hasilnya [a, b].

Latihan singkat

Uji: Promise.all([resolve(10), resolve(20)]) → a+b, harus `30`.