⊗jsSpPrmPH 173 of 294 menu

JavaScript-da Promise Hell muammosi

Siz allaqachon bilasizki, promiseler callback hell muammosini hal qilish uchun yaratilgan edi. Biroq, vaqt o'tishi bilan shu narsa ma'lum bo'ldiki, promiseler ham murakkab kodni vujudga keltirishi mumkin. Ushbu muammo o'xshashlik asosida promise hell deb nomlandi.

Keling, ushbu muammoni kod misollari orqali ko'rib chiqaylik. Faraz qilaylik, bizda getSmth funksiyasi mavjud bo'lib, u parametr oladi va shu parametrga qarab natija qaytaradi:

function getSmth(num) { return new Promise((resolve, reject) => { setTimeout(() => resolve(num * num), 1000) }); }

Bu holda biz ma'lum bir foydali operatsiyani (masalan, serverdan ma'lumot olishni) imitasiya qilmoqdamiz. Imitatsiya sifatida biz shunchaki parametr sifatida raqamni uzatamiz va bir soniyadan so'ng shu raqamning kvadratini qaytaramiz.

Keling, endi bizning getSmth funksiyamizdan boshqa funksiya ichida foydalanaylik:

function func() { getSmth(2).then(res => { console.log(res); // 4 ni chiqaradi }); } func();

Birinchi muammo

Bir-birining ortidan keluvchi ko'plab then konstruksiyalari kodni tushunishni qiyinlashtiradi:

function func(){ getSmth(2).then(res1 => { // nimadir qilamiz }).then(res2 => { // nimadir qilamiz }).then(res3 => { // nimadir qilamiz }).then(res4 => { // nimadir qilamiz }).then(res5 => { // nimadir qilamiz }).then(res6 => { // nimadir qilamiz }); } func();

Ikkinchi muammo

Boshqa tomondan ham muammo mavjud. Faraz qilaylik, endi biz o'zimizning funksiyamizdan ikki marta foydalanib, keyin natijalarni qo'shmoqchimiz. Natijada bizga quyidagi kod hosil bo'ladi:

function func() { getSmth(2).then(res1 => { getSmth(3).then(res2 => { console.log(res1 + res2); // 13 ni chiqaradi }); }); } func();

Bu allaqachon callback hell ni eslatayapti, shunday emasmi? Yana bir funksiya chaqiruvini qo'shamiz - kod yanada yomonroq bo'ladi:

function func() { getSmth(2).then(res1 => { getSmth(3).then(res2 => { getSmth(4).then(res3 => { console.log(res1 + res2 + res3); }); }); }); } func();

Albatta, Promise.all dan foydalanish mumkin:

function func() { Promise.all([getSmth(2), getSmth(3), getSmth(4)]).then(res => { console.log(res[0] + res[1] + res[2]); }); } func();

Biroq, biz bir xil narsani oldikmi? Yo'q! Birinchi holatda har bir yangi funksiya oldingi promisening tugashini kutadi, ikkinchi holatda esa - barcha promiseler bir vaqtning o'zida bajariladi. Bu farq keyingi funksiyaga oldingi chaqiruvni uzatmoqchi bo'lganimizda muhim ahamiyatga ega bo'ladi:

function func() { getSmth(2).then(res1 => { getSmth(res1).then(res2 => { getSmth(res2).then(res3 => { console.log(res3); }); }); }); } func();
Oʻzbek
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекTiếng Việt
Biz sayt ishlashi, tahlil qilish va shaxsiylashtirish uchun cookie-fayllardan foydalanamiz. Ma'lumotlarni qayta ishlash Maxfiylik siyosatiga muvofiq amalga oshiriladi.
hammasini qabul qilish sozlash rad etish