Tahlil: Qayta qo‘ng‘iroqlar va va’dalar

Odamlar, kulrang katakchalaringizni yuqorida tilga olingan Menga Balki qo‘ng‘iroq qiling (Karli Rey Jepsen) dan o‘zgartirilgan qo‘shiq so‘zlari bilan tanishishdan oldin, keling, bizga ruxsat bering. Ushbu maqola har tomonlama Javascriptning asinxron yondashuvini tushunish uchun tahliliy maqola ekanligi bilan yarashtiring!

Agar siz yashirincha ohangdor raqam bilan quloqlaringizni to'ldirishni istasangiz, men bu yerda havolani qoldiraman: https://www.youtube.com/watch?v=fWNaR-rxAic

Asinxron yondashuv va Javascript(JS)qo‘l-qo‘l bilan tug‘ilgan. Bu butunlay JS ning dizayn tuzilishi bilan bog'liq bo'lib, uni asinxron asboblar dunyosi bilan birlashtirishga majbur qiladi. JSda faqat bitta bajarilish chizig'i mavjud bo'lganligi sababli, sinxron yondashuvga moslashish ko'plabbo'sh ish vaqtiniga olib keladi, bu boshqa vazifalarni bajarish uchun samarali ishlatilishi mumkin [asinxron yondashuvning barebonelari. ]

Quyidagi rasm fikrni tushunishga yordam berishi mumkin:E'tibor bering, X o'qi qo'shimcha vaqt, Y o'qi esa hodisalardir -›

Endi savol asyncga qanday erishamiz! Men asinxronlik jangida mardonavor kurashgan ikkita raqibni tanishtiraman, ya'niQayta qo'ng'iroqlar va va'dalar!

Assalomu alaykum, mening ismim PD :) va men qo'shni uydagi Bee[uning taxallusli] qizi bilan uchrashmoqchiman. Sana aniqlash uchun umidsiz urinishda, men umid rangi bilan uning raqamini teraman! U telefonga javob beradi va men uni chiqishga ikkilanyapman. Katta qo'rquv bilan men undan so'rayman va u javob beradi "Aaaa..PD.. Men sizga bir soat ichida xabar beraman". Men buni iyagimga olib boraman va cho'milish, ofisga borish, nonushta qilish kabi kundalik mashg'ulotlarimni bajarishda davom etaman. Aytmoqchimanki, uning javobi men qilishim kerak bo'lgan boshqa muhim mashg'ulotlarga to'sqinlik qilmaydi! Keyinroq, bir soatdan so‘ng men uning javobini bilib olaman! Bu hikoya Javascriptdagi QAYTA QO‘NG‘IROQLARga yaqin bog‘liq.

Qayta qo'ng'iroq qilishbu yondashuv bo'lib, unda mavzu umuman hodisa tugashini kutmaydi! Agar vaqt talab qiladigan hodisa bo'lsa, ip barcha hodisalarni bajarishda davom etadi va vaqt talab qiladigan hodisaning bajarilishini qayta qo'ng'iroqqa surib qo'yadi. Qayta qo'ng'iroq qilish maqsadi birinchi darajali funktsiya [ishchi ip] tomonidan maqsadli ravishda amalga oshiriladi, u vaqt talab qiladigan hodisani amalga oshiradi va voqea tugagach, asosiy mavzuni holat haqida xabardor qiladi. Iltimos, misolga amal qiling:

Kod:

Konsol:

Izoh:

Birinchi ikkita natija men kundalik mashg'ulotlar bilan shug'ullanaman, shu bilan birga men undan HA/YO'Q javobini kutyapman. Shunday qilib,ReplyFromBeefunktsiyasi asosan qayta qo'ng'iroq bo'lib, u maftunkor xonimning javobiga g'amxo'rlik qiladi va u menga javob berishga tayyor bo'lganda, funksiya g'amxo'rlik qiladi! [Bu yerda men shartni taqlid qilish uchunsetTimeoutfunktsiyasidan foydalandim va unga 4000 millisekund kutish vaqti berdi]. Shuning uchun asinxron yetuklik o'rnatildi!

Endi asl hikoyaga qaytsak, men [PD] sanaga tayyorgarlik ko'raman, lekin menda bir dilemma bor. UHAdeydimi yoki YO‘Qmi? Ammo, do'stlarim orasida o'z maqomim bilan maqtanish uchun, agar uHA deb aytsa, men haydashda va Uchrashuvga tayyorgarlik ko'rishda davom etaman. Uni AUDI bilan olib keting. Phwwwwwwwww!!

Yuqoridagi vaziyatni tahlil qiladigan bo'lsak, bizning Sana haqidagi so'rovim uchta ishonchli stsenariyga tasniflanishi mumkinligini aniqlaymiz:

  • Kutilmoqda:Hozirgi holatim qanday!
  • Yechildi:U HA dedi va men TANISHNI olaman :) :) :) :)
  • Rad etilgan::( :( :( :`( :(

Javascriptdagi va'dalar real hayotdagi va'dalardir. Beeo'ziga ma'lum vaqt ichida javob berishga va'da berdi va menda uchta mumkin bo'lgan stsenariy bor [rasmiy shartlar]. Uning javobiga qarab, men oldin ham, keyin ham boshqa qadamlar qo'yishim mumkin. Keling, va'da kodini ko'rib chiqaylik:

Kod:

Kod tushuntirishi:

willIGetADate [ Promise creator ]funktsiyasi ikki argumentni hisobga oladigan JS va'da konstruktoridan foydalanadi, xususan hal qilishvarad etish. BeeResponse mantiqiy o'zgaruvchisining qiymatiga qarab, biz keyingi harakatlarni amalga oshiramiz va natijani hal qilish yoki rad etish parametrlari ichida o'tkazamiz. Boshqa tomondan,askBeefunktsiyasiVa'da beruvchi iste'molchiya'ni willIGetADate va'dasini iste'mol qiladi va mumkin bo'lgan natijani chiqaradi. Iltimos, .then va .catch dan foydalanishga e'tibor bering, ular Promise yaratish usuli asosida ishlaydi va bajarilgan qiymatdan o'tadi. Ammo, bajarilganning qiymati nima? bajarilganqiymat aynan siz hal qilish(muvaffaqiyatingiz_qiymati)ga bergan va'dangizdagi qiymatdir. Shuning uchun, u bizning holatlarimizdasanaobyektbo'ladi. Xuddi shunday, .catch qismida error.messagebiz qabul qilgan qiymatdan boshqa narsa emasreject(your_fail_value). Shuning uchun, bu bizning holatimizdasabab bo'ladi. Keling, natijani tekshiramiz.

Konsol chiqishi:

Ularning har biri bir xil maqsadda xizmat qiladigan ikkalasi o'rtasidagi asosiy farq ularningqo'shma qobiliyatidirbu asosan bir nechta va'dalarni birlashtirish [va'da zanjiri] ishlaydi, lekin bir nechta qayta qo'ng'iroqlarni birlashtirish tartibsiz kodga [qayta qo'ng'iroq jahannamiga] yo'l beradi. ]. Hatto o'qilishi nuqtai nazaridan ham, va'dalar qisqa, aniq ko'rinadi va qayta qo'ng'iroqlardan ajralib turadi.

E'tibor bering, va'dalar shunchaki sintaktik shakardir. Qayta qo'ng'iroqlar bilan qilishingiz mumkin bo'lgan va'dalar bilan qilishingiz mumkin bo'lgan hamma narsa.

BlokdaKuzatiladiganlarismli yangi bola borligini bilish yaxshi, bu dasturni voqealar oqimiga ro‘yxatdan o‘tishga majburlash orqali dasturda parallellikni joriy qilish harakatini kamaytiradi. Buni keyingi uchrashuvda muhokama qilaman.

Ungacha borib, Bee bilan vaqt o'tkazing! Baxtli kodlash.. :)