Materi
Promise dari fetch hanya ditolak bila permintaannya gagal, misalnya karena jaringan putus atau alamatnya rusak; penolakannya berupa TypeError. Jawaban berstatus 404 atau 500 tetap sebuah jawaban, jadi Promise-nya fulfilled. MDN menegaskan fetch tidak menolak Promise untuk status galat HTTP.
const res = await fetch("/api/stok/K9");
res.ok; // false
res.status; // 404 — Promise tetap fulfilled
try {
await fetch("https://server-mati.example/api");
} catch (e) {
e.name; // "TypeError": gagal di tingkat jaringan
}Penanda keberhasilan ada di response.ok, yang true hanya untuk status 200 sampai 299, dan angkanya di response.status. Periksa ok sebelum membaca badan. Badan jawaban galat belum tentu JSON; halaman galat sering berupa HTML, dan json() melempar SyntaxError bila badannya tidak bisa diurai sebagai JSON. Pesan SyntaxError seperti itu menyesatkan, karena masalah sebenarnya adalah statusnya.
Tiga keadaan itu butuh pesan berbeda untuk pengguna. 404 berarti yang dicari memang tidak ada, jadi mengulang permintaan tidak menolong. Status 5xx berarti server sedang bermasalah dan pengguna bisa mencoba lagi nanti. TypeError dari fetch berarti permintaannya tidak sampai, jadi yang diperiksa koneksinya.