Promises bilan sinxronlash kodining noto'g'ri aralashuvi kodni saqlashni qiyinlashtirishi mumkin

Va'dalar komponentingiz interfeysini aniq o'zgartirish orqali asinxron operatsiyalarni bajarish uchun juda yaxshi tuzilmani taqdim etadi.

Va shunday. Bu "proksi ob'ekt" emas.

Siz Promises dan foydalanayotganingiz uchun sinxron kod uslubingizni o'zgartirishni boshlashingiz mumkin. Asinxron kodni “chiroyli” ko‘rinishga olib kelganligi sababli, u sizning sinxronlash kodingizni “chiroyli” ko‘rinishiga olib kelishi mumkin, deb o‘ylashga urinib ko‘rishingiz mumkin va keyin siz va’dani qaytarmaydigan sinxron funksiyalarni ishga tushirish uchun Promises zanjirini suiiste’mol qila boshlaysiz. Haqiqatan ham, siz abstraktsiyalar darajasini keraksiz ravishda oshirasiz, natijada kodingiz haqida fikr yuritishni qiyinlashtiradi.

Xyuston, bizda muammo bor.

Siz va'dalar bilan ishlashni boshlamasligingiz kerak, go'yo bu kodingizni tuzishning yana bir usuli edi, unday emas. Va'dalar muayyan muammoni hal qiladi va bu muammo asinxronfunktsiyalarnisinxronxossalarni (masalan, throw va catch) meros qilib olishi, balkisinxron < yo'lini shunchaki o'zgartirmasligidir. /strong>kodi yozilgan.

Misol tariqasida quyidagi psevdokodni olaylik:

Ha, ehtimol uishlaydi. Birinchi yuqori tartibli va'da fetchSoccerMatchesFromResource()hal qilingandan so'ng, u yana bir va'dani qabul qiladigan thenable ni qaytaradi, keyinroq keyingi .then yilda bajariladi, yoki hal qilingan qiymat, bu butun ijro zanjirini buzmasligi uchun so'zsiz va'daga kiritiladi.

Uishlayotganiningto'g'riligini anglatmaydi.

"Sinxron funksiyalarni keraksiz ishga tushirish orqali Promises zanjirini suiiste'mol qilishning aniq samaradorlik oqibatlari" bilan bir qatorda, siz kodning ishlash maqsadini o'zgartirish orqali o'quvchining umidlarini ham buzasiz. Yuqoridagi misolda, bu funksiyalarning har biri oldidan .keyin thenable ni qaytaradi, buniqopqoq ostida uzoq davom etadigan operatsiyani bajaradi, u erda bo'lish uchun, hech qanday sababsiz mavjud bo'lgan sinxron funktsiyalarga ega bo'lish o'rniga.

Bu sabab bo'lishi mumkin bo'lgan muammolardan biri, o'quvchi "voqea tsikli" da uzoq davom etgan operatsiyadan kelib chiqadigan ba'zi muhim ishlash muammolarini aniqlashga harakat qilganda. Biz bilamizki, promises asinxron kodni sinxron kodning xususiyatlarini meros qilib olish uchun ishlatilishi kerak, shuning uchun bir nechta funksiyalar shunga o'xshash bajarilishini ko'rganda, .then chaqiruvdan oldingi har bir funktsiya uchun deb taxmin qilinadi. “voqea siklida” sodir boʻladigan potentsial qimmatga tushadigan uzoq davom etadigan operatsiya boʻladi, oxirgi funksiya bundan mustasno, hal qilingan maʼlumotlar bilan sinxron oqimini davom ettirishi kerak.

Keyingi “.then” chaqiruvidan oldin faqat hal qilingan qiymatni qaytarish kod sinxron yoki asinxron bajarilayotganligini aniqlashni qiyinlashtiradi.

Yuqoridagi muammo kichik sonli funktsiyalar bilan ishlashda o'zini juda aniq ko'rsatmaydi. Bunday holda, nima sodir bo'layotganini tushunish qiyin emas, chunki barcha funktsiyalar yaqinroq, eng muhimi: ular kichikdir. Agar sizda ko'p ichki abstraktsiyalar mavjud bo'lsa, muammo aniq bo'ladi. Bunday holda, kodni o'qiyotganda qaytarilgan funktsiyaning qiymati nimani anglatishini aniq ko'rsatishning bir usuli yo'q va kod nima qilishini tushunish uchun har doim yuqoriga va pastga qarab turishingiz kerak, hatto agar funktsiya juda yuqori uyushishga ega bo'lsa.

Quyidagi misolni ko'rib chiqing:

100% ishonch bilan ayta olasizmi, addToCache qo'shimcha asinxron so'rov yubormayapti? U modul oʻzgaruvchisidagi xotira keshiga qoʻshilmoqdami yoki Redis-da davom etyaptimi? Kod "o'z-o'zidan hujjatlashtirilgan" emas, buni tushunish uchun sizga qo'shimcha bilim kerak.

Bu muammo faqat va'dalarni noto'g'ri ishlatish bilan chegaralanib qolmaydi, u har qanday abstraktsiya bilan sodir bo'lishi mumkin, bunda siz o'zgaruvchining turini u ishlatilayotgan kontekstda samarali xulosa qila olmaysiz.

Ammo nima uchun Promise spetsifikatsiyasi qiymatni qaytarishga imkon beradi? Qaytishni faqat va'da bilan cheklash va boshqa hech narsa bilan cheklash yaxshiroq emasmi? Xo'sh, siz qimmat operatsiyani bajaradigan va'dani qaytarishingiz kerak bo'lgan talabga ega bo'lishingiz mumkin. Misol uchun, agar qiymat tashqi keshda bo'lsa, siz to'g'ridan-to'g'ri qiymatni qaytarishingiz mumkin, ammo keyin zanjirning qolgan qismi siz va'dani qaytargandek harakat qiladi. Bu qonuniy foydalanish, chunki bu holda siz faqat sinxron maqsadlarda yozmayapsiz.

Quyidagi kod mashhur "Bizda va'dalar bilan bog'liq muammo" maqolasidagi №5 mavzu misollaridan biri ilhomlantirilgan:

addToCache misolidagi muammolarning oldini olish uchun biz bajarilish faqat sinxron bo'lganida sinxron koddan foydalanishimiz kerak va bajarilish asinxron bo'lishi mumkin bo'lganda Promises-dan foydalanishimiz kerak:

Ushbu naqsh shuningdek "Mustahkamlik printsipi" ga mos keladi:

  • .then funktsiyasi qaytish sifatida qabul qilgan narsada liberal bo'ladi, u Va'da yoki hal qilingan qiymat bo'lishi mumkin.
  • Siz qaytganingizdan so'ng, sizyuborgan narsangizda konservativ bo'lishingiz kerak, o'zingiz qilishingiz kerak bo'lgan ishni sinxron ravishda bajarishingiz va faqat buni amalga oshirish uchun asosli sabab bo'lsa, biror narsani qaytarishingiz kerak.

Va'dalar juda foydali, ammo sinxron kodni ishlatish uchun ulardan foydalanish kelajakda sizning kodingizni o'qiydigan boshqa ishlab chiquvchilar uchun yoki hatto kod bazasi o'sib borishi bilan o'zingiz uchun kutilmagan natijalarga olib kelishi mumkin.

O'qiganingiz uchun rahmat. Agar sizda qandaydir fikr-mulohazalaringiz bo'lsa, men bilan "Twitter", "Facebook" yoki "Github" orqali bog'laning.