JavaScript Promise obyekti, uning 3 holati (Pending, Fulfilled, Rejected), then, catch, finally metodlari, Promise chaining, parallel ishlash (Promise.all, Promise.allSettled, Promise.race) va mikrotasklar tabiati.
Chapter 26'da Callback Hell muammosini ko'rdik. Promise — aynan shu muammoni hal qilish uchun ES6'da qo'shilgan, asinxron kod bilan ishlashning zamonaviy va tartibli usuli.
Promise — kelajakda tugaydigan (yoki muvaffaqiyatli, yoki xatolik bilan) asinxron amalning **"va'dasi"**ni ifodalovchi object.
🎫 Promise'ni restoran chekiga o'xshating: taom buyurtma qilganingizda, sizga darhol taom emas, balki chek raqami (Promise) beriladi. Bu chek — "sizning taomingiz tayyor bo'lganda (yoki oshxonada muammo chiqsa) sizga xabar beriladi" degan va'da. Siz o'sha chek bilan boshqa ishlaringizni davom ettirasiz.
| Holat | Ma'nosi |
|---|---|
| Pending | Kutilmoqda — hali natija yo'q |
| Fulfilled | Muvaffaqiyatli tugadi |
| Rejected | Xatolik bilan tugadi |
code.textTEXTPromise yaratiladi│[Pending]/ \/ \muvaffaqiyatli xatolik│ │[Fulfilled] [Rejected]
💡 Key Idea
Promise — bir marta Pendingdan Fulfilled yoki Rejectedga o'tgandan keyin, uning holati hech qachon o'zgarmaydi ("settled" bo'ladi). Bu — Promise'ning ishonchliligini ta'minlaydi.
script.jsJavaScriptlet myPromise = new Promise(function (resolve, reject) {let success = true;setTimeout(function () {if (success) {resolve("Amal muvaffaqiyatli bajarildi!");} else {reject("Xatolik yuz berdi!");}}, 1000);});
new Promise(...) — Promise constructor'iga bitta function (executor) beriladi.resolve (muvaffaqiyat uchun) va reject (xatolik uchun).resolve(natija) chaqiriladi.reject(xatolik) chaqiriladi.Promise natijasini "iste'mol qilish" uchun then(), catch(), finally() metodlari ishlatiladi.
script.jsJavaScriptmyPromise.then(function (result) {console.log("Muvaffaqiyat: " + result);}).catch(function (error) {console.log("Xatolik: " + error);}).finally(function () {console.log("Har doim ishga tushadi");});
| Metod | Qachon ishga tushadi |
|---|---|
.then(onFulfilled) | Promise resolve bo'lsa |
.catch(onRejected) | Promise reject bo'lsa |
.finally(callback) | Har ikkala holatda ham |
🔗 Connection
.finally() — Chapter 18'dagi try/catch/finallyning Promise dunyosidagi analogi.
.then() — har doim yangi Promise qaytaradi, shuning uchun uni zanjir shaklida ketma-ket yozish mumkin. Bu — Callback Hell muammosini hal qiladigan asosiy xususiyat.
Chapter 26'da ko'rgan edik:
script.jsJavaScriptgetUser(1, function (user) {getPosts(user.id, function (posts) {getComments(posts[0].id, function (comments) {console.log(comments);});});});
script.jsJavaScriptgetUser(1).then(user => getPosts(user.id)).then(posts => getComments(posts[0].id)).then(comments => console.log(comments)).catch(error => console.log("Xatolik: " + error));
code.textTEXTgetUser(1)│ .then()▼getPosts(user.id)│ .then()▼getComments(posts[0].id)│ .then()▼console.log(comments)(istalgan bosqichda xatolik bo'lsa,zanjir darhol .catch()ga "sakraydi")
🔥 Important
Har bir .then() ichida qaytarilgan qiymat (yoki Promise) — keyingi .then()ga argument sifatida uzatiladi. Agar .then() ichida yana bir Promise qaytarilsa, zanjir o'sha Promise tugashini kutadi, keyin davom etadi.
script.jsJavaScriptfunction getUser(id) {return new Promise((resolve, reject) => {setTimeout(() => {if (id > 0) {resolve({ id: id, name: "Ali" });} else {reject("Noto'g'ri ID");}}, 500);});}function getPosts(userId) {return new Promise((resolve) => {setTimeout(() => {resolve(["Post 1", "Post 2"]);}, 500);});}getUser(1).then(user => {console.log("Foydalanuvchi: " + user.name);return getPosts(user.id);}).then(posts => {console.log("Postlar: " + posts.join(", "));}).catch(error => {console.log("Xatolik: " + error);});
Natija:
code.textTEXT(500ms kutish)Foydalanuvchi: Ali(yana 500ms kutish)Postlar: Post 1, Post 2
Promise.all() — bir nechta Promise'ni bir vaqtda (parallel) bajarib, barchasi tugaguncha kutadi.
🍽️ Agar 3 ta taomni ketma-ket emas, bir vaqtning o'zida buyurtma qilsangiz (parallel), va faqat hammasi tayyor bo'lgach stolga olib kelinishini kutsangiz — bu Promise.all().
script.jsJavaScriptlet promise1 = new Promise(resolve => setTimeout(() => resolve("Birinchi"), 1000));let promise2 = new Promise(resolve => setTimeout(() => resolve("Ikkinchi"), 2000));let promise3 = new Promise(resolve => setTimeout(() => resolve("Uchinchi"), 1500));Promise.all([promise1, promise2, promise3]).then(results => {console.log(results); // ["Birinchi", "Ikkinchi", "Uchinchi"]});// Umumiy kutish vaqti: ~2000ms (eng uzunisiga qarab, YIG'INDI EMAS!)
Agar bu 3 ta amal ketma-ket (.then() zanjiri orqali) bajarilganda, umumiy vaqt $1000 + 2000 + 1500 = 4500$ms bo'lardi. Promise.all() bilan esa ular parallel ishlagani uchun, umumiy vaqt eng uzun Promise'ning vaqtiga (2000ms) teng bo'ladi.
⚠️ Common Mistake
Promise.all() — agar birorta Promise reject bo'lsa, darhol butun Promise.all() rad etiladi (reject), garchi qolganlari muvaffaqiyatli bo'lsa ham. Agar barcha natijalarni (muvaffaqiyatli yoki yo'q) olish kerak bo'lsa, Promise.allSettled() ishlatiladi.
| Metod | Vazifasi |
|---|---|
Promise.all() | Barchasi tugashini kutadi, birortasi rad etsa — darhol rad etadi |
Promise.allSettled() | Barchasi tugashini kutadi, natijalarni (muvaffaqiyat/xato) alohida-alohida qaytaradi |
Promise.race() | Faqat birinchi tugagan Promise natijasini qaytaradi |
Task:
checkAge(age) nomli Promise qaytaruvchi function yozing — agar age >= 18 bo'lsa resolve("Kattasiz"), aks holda reject("Kichiksiz") chaqirsin. .then()/.catch() bilan sinab ko'ring.
Required Concepts:
new Promiseresolve/rejectnew Promise((resolve, reject) => { if (age >= 18) resolve(...); else reject(...); })Task:
Ikkita Promise qaytaruvchi function yozing: step1() (1 soniyada "Bosqich 1" qaytaradi) va step2(data) (datani qabul qilib, yana 1 soniyada data + " → Bosqich 2" qaytaradi). Ularni .then() zanjiri orqali ketma-ket chaqiring.
Required Concepts:
Task:
Uchta Promise yarating (turli kutish vaqtlari bilan, ba'zilari reject bo'ladigan qilib). Promise.allSettled() yordamida barcha natijalarni (muvaffaqiyatli yoki xato) alohida-alohida chiqaring.
Required Concepts:
Promise.allSettled(){ status: "fulfilled", value: ... } yoki { status: "rejected", reason: ... } shaklidagi object'lar array'i bo'ladi.script.jsJavaScriptconsole.log("A");Promise.resolve().then(() => console.log("B"));console.log("C");
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> A C BWhy?
Promise.resolve().then(...) — garchi Promise darhol hal qilingan (resolved) bo'lsa ham, .then() ichidagi kod baribir asinxron (mikrotask navbatida) bajariladi, ya'ni joriy sinxron kod ("A", "C") to'liq tugagandan keyingina ishga tushadi. Bu — Chapter 29'da (Event Loop) chuqurroq tushuntiriladi.
Quyidagi kodda muammo bor:
script.jsJavaScriptfunction getData() {return new Promise((resolve, reject) => {setTimeout(() => {resolve("Ma'lumot");}, 1000);});}getData().then(data => {console.log(data);});console.log("Bu birinchi chiqishi kerak edi, lekin chiqmayapti");
Your Task:
Bu birinchi chiqishi kerak edi, lekin chiqmayapti
(1 soniyadan keyin)
Ma'lumot
Xulosa: Bu — kod xatosi emas, balki Promise'ning tabiiy asinxron xatti-harakati. Agar tartib muhim bo'lsa, console.logni .then() ichiga joylashtirish kerak (Chapter 28'da async/await bu holatni yanada tushunarli qiladi).
</details>.then(), .catch(), .finally() — Promise natijasini qayta ishlash uchun.Promise.all() — bir nechta Promise'ni parallel bajarib, barchasi tugashini kutadi.Promise.allSettled() — barcha natijalarni (muvaffaqiyat/xato) qaytaradi, birortasi rad etsa ham to'xtamaydi..then() — yangi Promise qaytaradi, shuning uchun zanjirlash mumkin..catch() — zanjirdagi istalgan bosqichdagi xatolikni ushlaydi.Promise.all() — parallel bajarish orqali umumiy kutish vaqtini qisqartiradi.script.jsJavaScriptlet promise = new Promise((resolve, reject) => {if (/* muvaffaqiyat */) resolve(value);else reject(error);});promise.then(value => { }).catch(error => { }).finally(() => { });Promise.all([p1, p2, p3]).then(results => { });Promise.allSettled([p1, p2, p3]).then(results => { });Promise.race([p1, p2, p3]).then(first => { });
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: