JavaScript-da Promislar (Promises)
"Men sizga natijani va'da qilaman!" — Promise asinxron amallarni osonroq va tartibliroq boshqarish uchun yaratilgan obyekt hisoblanadi.
Promise nima?
Promise — bu asinxron amalning yakunlanishi yoki muvaffaqiyatsizligi haqidagi ma'lumotni saqlaydigan "konteyner" obyektidir.
Promise Holatlari (States)
Promise har doim quyidagi uchta holatdan birida bo'ladi:
| Holat (State) | Tavsifi |
|---|---|
| Pending | Amal boshlangan, lekin hali tugallanmagan (kutish). |
| Fulfilled | Amal muvaffaqiyatli yakunlandi va natija tayyor. |
| Rejected | Amalda xatolik yuz berdi. |
Nima uchun Promislar kerak?
Ccallback-lar yordamida yozilgan kodlar (ayniqsa "callback hell") o'qishga juda murakkab bo'ladi. Promislar xuddi shu mantiqni o'qilishi oson va tartibli zanjir ko'rinishida yozishga imkon beradi.
Misol: Callback Hell vs Promise
// Callback bilan (eski usul):
step1(function (r1) {
step2(r1, function (r2) {
console.log(r2)
})
})
// Promise bilan (yangi usul):
step1()
.then((r1) => step2(r1))
.then((r2) => console.log(r2))Promise yaratish
Promise konstruktori ikkita parametr (resolve va reject) qabul qiladigan funksiyani oladi.
Sintaksis
let myPromise = new Promise(function (resolve, reject) {
// Ba'zi asinxron ishlar...
if (muvaffaqiyatli) {
resolve(natija) // Natija qaytaradi
} else {
reject(xato) // Xatolik qaytaradi
}
})Promise-dan foydalanish: then() va catch()
Promise natijasini olish uchun biz uning metodlaridan foydalanamiz:
.then()— muvaffaqiyatli natija (resolve) uchun..catch()— xatolik (reject) uchun..finally()— natija qanday bo'lishidan qat'iy nazar oxirida bajariladi.
Misol
myPromise
.then(function (value) {
console.log('Muvaffaqiyatli: ' + value)
})
.catch(function (error) {
console.log('Xato: ' + error)
})Promise Zanjiri (Chaining)
Promislarning eng kuchli tomoni — ularni bir-biriga ulash mumkinligidir. Har bir .then() yangi Promise qaytarishi mumkin.
Misol
fetch('data.json')
.then((response) => response.json()) // JSON-ga o'giradi (Promise qaytaradi)
.then((data) => console.log(data)) // Ma'lumotni chiqaradi
.catch((err) => console.error(err)) // Xaroni ushlaydiMuhim
Zanjirning istalgan joyida yuz bergan xato oxiridagi bitta .catch() orqali ushlanadi. Bu kodni ancha toza qiladi.
Promise API Metodlari
Agar sizda bir nechta promislar bo'lsa, ularni bir vaqtda boshqarish mumkin:
- Promise.all([p1, p2]) — Hamma promislar muvaffaqiyatli bo'lsagina natija qaytaradi.
- Promise.allSettled([p1, p2]) — Bor bo'lgan barcha natijalarni (xato bo'lsa ham) qaytaradi.
- Promise.race([p1, p2]) — Qaysi birinchi tugasa (winner), o'shani qaytaradi.
