AJAX texnologiyasi, fetch() metodi va uning ikki bosqichli javobi, HTTP statuslari, response.ok tekshiruvi, POST so'rovlari va Promise.all orqali parallel ma'lumot olish.
Bu bob bilan PART 5 (DOM & Browser) yakunlanadi. Bu bobda serverdan ma'lumot olish — veb-dasturlashning eng muhim amaliy ko'nikmalaridan birini o'rganamiz. Bu yerda Chapter 27-28'da o'rgangan Promise va async/await bilimlarimiz to'liq amaliy qo'llanilishini topadi.
AJAX (Asynchronous JavaScript and XML) — sahifani to'liq qayta yuklamasdan, serverdan ma'lumot olish yoki serverga ma'lumot yuborish texnikasi.
📬 AJAX'siz — bu har safar yangi xat olish uchun butun pochta bo'limiga borishga o'xshaydi (butun sahifa qayta yuklanadi). AJAX bilan — bu shunchaki pochta qutingizni tekshirishga o'xshaydi (faqat kerakli ma'lumot yangilanadi, qolgan sahifa o'zgarmaydi).
AJAX'siz, foydalanuvchi harakati (masalan, "Ko'proq ko'rsatish" tugmasini bosish) — butun sahifani qayta yuklashni talab qilardi, bu esa sekin va noqulay tajriba yaratardi.
fetch() — serverga so'rov yuborish uchun zamonaviy, Promise asosidagi JavaScript function.
script.jsJavaScriptfetch("[https://api.example.com/users](https://api.example.com/users)").then(response => response.json()).then(data => {console.log(data);}).catch(error => {console.log("Xatolik: " + error);});
script.jsJavaScriptasync function getUsers() {try {let response = await fetch("[https://api.example.com/users](https://api.example.com/users)");let data = await response.json();console.log(data);} catch (error) {console.log("Xatolik: " + error);}}
🔗 Connection
Bu — Chapter 28.1'da ko'rgan misolning to'liq, real amaliy ko'rinishi. fetch() — Promise qaytaradi, shuning uchun uni .then() yoki await bilan ishlatish mumkin.
fetch()ning ishlash mexanizmi ko'pchilikni chalg'itadi, chunki natijani olish uchun ikki marta await (yoki .then()) kerak bo'ladi.
script.jsJavaScriptlet response = await fetch(url);let data = await response.json(); // Nega bu yerda YANA await kerak?
await fetch(url) — server bilan "aloqa o'rnatilishi va sarlavhalar (headers) kelishi"ni kutadi. Bu bosqichda, response object'i allaqachon mavjud, lekin uning tanasi (body) hali to'liq yuklab olinmagan bo'lishi mumkin (agar ma'lumot katta bo'lsa).await response.json() — javobning tanasini to'liq o'qib, uni JavaScript object'iga aylantirishni kutadi. Bu — alohida, potentsial "sekin" amal, chunki katta ma'lumot hajmi uchun vaqt kerak bo'lishi mumkin.code.textTEXTfetch(url)│▼ 1-bosqich: server bilan aloqa, sarlavhalar keladiresponse object (hali "tana" to'liq emas)│▼ 2-bosqich: response.json() — tanani o'qish va parse qilishdata (haqiqiy JavaScript object)
💡 Key Idea
response.json() — Chapter 19'da o'rgangan JSON.parse()ga o'xshash ishni bajaradi, lekin u to'g'ridan-to'g'ri fetch javobining tanasi (odatda JSON formatidagi matn) bilan ishlaydi va Promise qaytaradi.
Bu — fetch()ning eng ko'p chalkashtiriladigan xususiyati: fetch() faqat tarmoq butunlay ishlamay qolganda (masalan, internet yo'q) catchga o'tadi. Agar server 404 (topilmadi) yoki 500 (server xatosi) qaytarsa, fetch() buni hali ham "muvaffaqiyatli" so'rov deb hisoblaydi!
script.jsJavaScriptasync function getUser(id) {let response = await fetch(`/api/users/${id}`);let data = await response.json();return data; // Agar server 404 qaytarsa ham, bu yerga yetib boradi!}
script.jsJavaScriptasync function getUser(id) {let response = await fetch(`/api/users/${id}`);if (!response.ok) {throw new Error(`Server xatoligi: ${response.status}`);}let data = await response.json();return data;}
| Property | Vazifasi |
|---|---|
response.ok | true agar status 200-299 oralig'ida bo'lsa |
response.status | HTTP status kodi (masalan, 200, 404, 500) |
response.statusText | Status matnli tavsifi |
⚠️ Common Mistake
response.okni tekshirishni unutish — production kodida eng ko'p uchraydigan fetch xatolaridan biri. Server xatolik qaytarganda ham, kod "muvaffaqiyatli" deb davom etib, keyinchalik tushunarsiz xatoliklarga olib keladi.
Serverga ma'lumot yuborish uchun, fetch()ga qo'shimcha sozlamalar (options) berish kerak.
script.jsJavaScriptasync function createUser(userData) {let response = await fetch("[https://api.example.com/users](https://api.example.com/users)", {method: "POST",headers: {"Content-Type": "application/json"},body: JSON.stringify(userData)});if (!response.ok) {throw new Error("Yaratishda xatolik: " + response.status);}return await response.json();}createUser({ name: "Ali", age: 25 }).then(newUser => console.log("Yaratildi: ", newUser)).catch(error => console.log(error.message));
method: "POST" — bu GET emas, POST so'rovi ekanini bildiradi.headers — serverga yuborilayotgan ma'lumot formati JSON ekanini "aytadi".body: JSON.stringify(userData) — Chapter 19'da o'rgangan JSON.stringify() orqali, JavaScript object'i serverga tushunarli JSON string formatiga aylantiriladi.🔗 Connection
Bu misol — Chapter 18 (Error Handling), Chapter 19 (JSON), Chapter 27-28 (Promise/async-await) — barcha oldingi bilimlarni birlashtirgan holda, real dasturlashda qanday ishlatilishini ko'rsatadi.
script.jsJavaScriptasync function loadDashboard(userId) {try {let [user, posts, notifications] = await Promise.all([fetch(`/api/users/${userId}`).then(r => r.json()),fetch(`/api/users/${userId}/posts`).then(r => r.json()),fetch(`/api/users/${userId}/notifications`).then(r => r.json())]);console.log(user, posts, notifications);} catch (error) {console.log("Yuklashda xatolik: " + error.message);}}
Bu — Chapter 28.3'da o'rgangan "mustaqil amallarni parallel bajarish" tamoyilining to'g'ridan-to'g'ri amaliy qo'llanilishi: uchta so'rov bir-biriga bog'liq bo'lmagani uchun, ular ketma-ket emas, parallel yuboriladi — bu sahifa yuklanish tezligini sezilarli oshiradi.
Task:
fetch("https://jsonplaceholder.typicode.com/users/1") orqali ma'lumot oling va uni .then() zanjiri bilan konsolga chiqaring.
Required Concepts:
fetch(), .then().then(response => response.json()).then(data => console.log(data))Task:
Yuqoridagi so'rovni async/await va try/catch bilan qayta yozing, response.okni tekshirib, xato bo'lsa mos xabar chiqaring.
Required Concepts:
async/awaitresponse.okTask:
Promise.all() yordamida ikkita mustaqil fetch so'rovini (masalan, ikkita turli foydalanuvchi ma'lumotini) bir vaqtda yuboring va natijalarni birgalikda chiqaring. Xatolikni to'g'ri boshqaring.
Required Concepts:
Promise.all() + fetchtry/catchscript.jsJavaScriptasync function getData() {let response = await fetch("[https://api.example.com/nonexistent](https://api.example.com/nonexistent)");console.log(response.ok);console.log(response.status);}
Agar nonexistent manzili mavjud bo'lmasa (server 404 qaytarsa), nima bo'ladi?
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> false 404Why?
fetch() — server javob berayotgan ekan (garchi 404 bilan bo'lsa ham), bu tarmoq xatosi emas, shuning uchun catchga tushmaydi. response.ok — false bo'ladi (chunki 404 — 200-299 oralig'ida emas), response.status esa aniq 404 qiymatini ko'rsatadi.
Quyidagi kodda muammo bor — dasturchi 404 xatoligini kutmoqda, lekin kod buni "sezmayapti":
script.jsJavaScriptasync function getUser(id) {let response = await fetch(`/api/users/${id}`);let data = await response.json();return data;}getUser(99999) // mavjud bo'lmagan ID.then(data => console.log("Foydalanuvchi: ", data)).catch(error => console.log("Xatolik: ", error));// "Xatolik" hech qachon chiqmaydi, garchi 404 qaytarilsa ham
Your Task:
.catch() ishga tushmayotganini tushuntiring.Yechim:
</details>script.jsJavaScriptasync function getUser(id) {let response = await fetch(`/api/users/${id}`);if (!response.ok) {throw new Error(`Foydalanuvchi topilmadi: ${response.status}`);}let data = await response.json();return data;}getUser(99999).then(data => console.log("Foydalanuvchi: ", data)).catch(error => console.log("Xatolik: ", error.message));// Endi "Xatolik: Foydalanuvchi topilmadi: 404" to'g'ri chiqadi
fetch() — Promise asosidagi, zamonaviy AJAX vositasi.fetch() javobini olish — ikki bosqichli: avval fetch(), keyin response.json().fetch() — faqat tarmoq xatosida reject bo'ladi, 404/500ni avtomatik xato deb hisoblamaydi.response.ok/response.status — server javobini to'g'ri tekshirish uchun ishlatiladi.fetch()dan olingan javobni ishlatishdan oldin, har doim response.okni tekshiring.response.json()ni ham awaitlash (yoki .then()) kerak.Promise.all() bilan parallel yuborish — sahifa tezligini oshiradi.script.jsJavaScript// GETasync function getData(url) {let response = await fetch(url);if (!response.ok) throw new Error(response.status);return await response.json();}// POSTasync function postData(url, data) {let response = await fetch(url, {method: "POST",headers: { "Content-Type": "application/json" },body: JSON.stringify(data)});if (!response.ok) throw new Error(response.status);return await response.json();}
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: