Promise metodlari va ishlatish holatlari
Josh*Assalaamu alaykum!
Bundan oldingi maqolamizda Promise haqida va uni ishlatish haqida gaplashgan bo'ldik. Bu safargi maqolamizda uni batafsilroq yoritishga harakat qilamiz. Alloh qodir qilgancha.
Bismillah!
Promise tarixi haqida qisqacha oldingi maqoladan tanishmiz. Ushbu maqolamizning avalki qismlarini kanal menyusidan topib olasiz.
Shuningdek event loop haqidagi maqolani ham bir o'qib chiqsangiz foydadan xoli bo'lmaydi.
Promise sintaksisi
Promise sintaksisi haqida oldingi maqoladan tanish bo'lgan bo'lsakda, yana bir eslab o'tib tahlil qilish foydadan holi bo'lmaydi.

Demak, Promiselar "new Promise()" konstruktor funksiyasi orqali yasaladi va u argument sifatida 1 ta funksiya qabul qilar edi. Bu funksiya ichida esa 2ta argument funksiya sifatida qabul qilinar edi(resolve va reject), muvaffaqqiyatli ish bajarilsa resolve() chaqiriladi, state esa fulfilled bo'ladi va natija o'sha funksiya qaytargan ma'lumot hisoblanadi, ya'ni { state: fulfilled, data: workDone }. Biz qo'ygan shart bajarilmagan taqdirda, reject() ni chaqiramiz va bunga argument sifatida shu xatolik sababini berib yuboramiz. Bunda { state: rejected, data: sabab } ni Promiseimiz qaytarib beradi. Promise ichiga asinxron kod yozib, uni hali ish tugatilmasdan ishlatib qo'ygan taqdirimizda { state: pending, data: undefined } bo'ladi. Chunki hali data ma'lum emas.
Bizning bu ishimiz "producing", ya'ni kod ishlab chiqish deyiladi. Bu kod ishlab chiqilgandan keyin uni ishlatishimiz kerak.
Xop, yaxshi, promise yasashni o'rgandik, endi u qaytargan ma'lumotdan qanday qilib foydalamiz degan savol paydo bo'lishi tabiiy. Buning uchun Promisening alohida metodlari bor edi.
- .then(data => {....})
- .catch(err => {...})
Bu ikki metod Promisedan keladigan ma'lumotlarni ustida ishlash uchun ishlatilinadigan metodlar hisoblanardi. Biz bular haqida gaplashganmiz. Ammo qolgan metodlar ham bormi ? 🤔
Promisening boshqa metodlari
Promise.all(array)
Bu metod yordamida bir qancha Promiselarni array ko'rinishida qabul qiladi va barcha Promiselarga bog'lanib chiqadi. Uning sharti shuki, barcha berilgan Promiselar resolve bo'lsagina barcha javoblarni qaytaradi.
Bordi-yu birortasi reject bo'lsa, faqat .catch() blokida o'sha xatolik sababi qaytariladi.
Misollar.
Barcha promise resolve bo'lganda:

Bordi-yu birortasi reject qilinsa:

Bunda prom3 ichida "agar bool false bo'lsa resolve, true bo'lsa reject qil" deb shart qo'ydik. Natijada reject ishladi va unga .then() va .catch() orqali ulanib javobni kutayotganda .then() emas, .catch() metod ishladi va reject sababini qaytardi.
Bu metod ko'pincha qachon ishlatiladi ?
- Ko'proq bizga barcha Promiselardan javob kelishi shart bo'lgan holatlarda. Birortasi yiqilsa barchasi yiqiladi.
Promise.race(array)
bu metod Promise.all ga o'xshash, farqi shundaki, bu metod faqat birinchi resolve yoki reject bo'lgan Promise natijasini qaytaradi

Birinchi promise shartiga u reject qiladigan qilib o'zgartirish kiritamiz:

Bu qachon ishlatiladi ?
- Bizda ba'zan shunday holatlar bo'ladiki, birnecha Promisedan faqatgina bittasini javobi kelishi yetarli bo'ladi. Masalan poyga o'yinida birinchi o'rinni aniqlash uchun bizga yagona birinchi kelgan ishtirokchi yetarli bo'lgani kabi.
Promisening boshqa metodlari ham bor (ko'p emas), hozircha shularni bilish yetadi.
Yakun
Bu misollarda promise ichida asinxron kod yozilmadi. Haqiqiy dasturlarda ularni ichida asinxron kod (masalan serverga 'get' so'rovini jo'natish) va hokazolar yoziladi va o'rganganimizdek .then() va .catch() orqali javoblar ustida ishlanadi.
Promiselar 'callback hell' muommosini hal qilsada, boshqa muommo yuzaga keldi: kod borgan sari tushunishga qiyinlashib boradi(Misol uchun .then().then().then() sintaksi). Shuning uchun bizda Promise lar bilan ishlashda yangicha usul paydo bo'lgan. U bilan keyingi maqolamizda tanishib chiqamiz.
O'rgangan ilmimizni Alloh manfaatli qilsin. Maqolani yozishda katta yordam bergan birodarimdan Alloh rozi bo'lsin.
Demak biz davom etamiz 😉
InshaaAlloh.