Fetch & Promises — JavaScript

Coba bayangin order GoFood. Kamu tap "pesan", aplikasi langsung nampilin "lagi cari driver..." — kamu BELUM tau kapan makanan dateng, tapi sistem janji bakal…

Ada pekerjaan yang butuh waktu, misalnya minta data ke server lewat internet. JavaScript gak berhenti menunggu: dia lanjut ke baris berikutnya, lalu baru mengurus hasilnya waktu jawabannya datang. fetch() adalah cara modern buat mengirim permintaan seperti itu (HTTP request) dari browser.

🧪 Tebakan cepat: di kode bagian pertama, console.log('Menunggu jawaban...') ditulis paling bawah. Dia tercetak duluan atau belakangan? Tebak dulu, jawabannya ada di bagian "Minta data dengan fetch".

Minta data dengan fetch

fetch('https://api.example.com/students/1')
  .then((res) => {
    if (!res.ok) throw new Error('HTTP ' + res.status)
    return res.json()
  })
  .then((data) => {
    console.log('Nama:', data.name)
  })
  .catch((err) => {
    console.log('Gagal:', err.message)
  })

console.log('Menunggu jawaban...')

Yang tercetak, berurutan:

Menunggu jawaban...
Nama: Budi

Baris paling bawah tercetak duluan. fetch mengirim permintaan lalu gak menunggu, jadi JavaScript langsung lanjut ke console.log('Menunggu jawaban...'). Baru waktu jawaban server datang, fungsi di dalam .then jalan.

fetch cuma gagal sendiri kalau jawabannya gak datang sama sekali, misalnya waktu offline. Jawaban 404 (data gak ketemu) tetap dianggap berhasil, makanya res.ok dicek lalu throw sendiri.

Bikin Promise sendiri

function cekStok(jumlah) {
  return new Promise((resolve, reject) => {
    if (jumlah > 0) {
      resolve('Stok ada')
    } else {
      reject('Stok habis')
    }
  })
}

cekStok(3).then((hasil) => console.log(hasil))    // Stok ada
cekStok(0).catch((alasan) => console.log(alasan)) // Stok habis

Promise selalu punya satu dari tiga status: pending (masih menunggu), fulfilled (berhasil, lewat resolve), atau rejected (gagal, lewat reject). Sekali selesai, statusnya gak berubah lagi.

Promise yang selesai sesudah jeda

setTimeout(fungsi, ms) menjadwalkan fungsi buat jalan sesudah sekian milidetik. Panggil resolve di dalam jadwal itu, maka Promise-nya baru selesai sesudah jeda:

function tungguLalu(pesan) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Pesan: ' + pesan)
    }, 500)
  })
}

tungguLalu('siap').then((hasil) => console.log(hasil))
console.log('Mulai')

Yang tercetak Mulai dulu, setengah detik kemudian Pesan: siap. Kalau resolve ditulis di luar setTimeout, Promise-nya selesai seketika tanpa jeda.

⚠️ Jebakan yang sering ketemu

TL;DR: Kode sesudah fetch jalan duluan, hasilnya diurus belakangan di .then. fetch(url) mengembalikan Promise: .then buat hasil, .catch buat kegagalan, dan cek res.ok karena 404 gak dianggap gagal. Bikin Promise sendiri dengan new Promise((resolve, reject) => ...): resolve(nilai) buat berhasil, reject(alasan) buat gagal. Statusnya pending, lalu fulfilled atau rejected.

Yang akan kamu pelajari