Asinxdan qanday qochish / do'zaxni kutish

async / kutish bizni qayta jahannamdan ozod qildi, ammo odamlar uni suiiste'mol qila boshladilar - bu asinxning tug'ilishiga olib keladi / do'zaxni kutadi.

Ushbu maqolada men asin / do'zaxni kutish nima ekanligini tushuntirishga harakat qilaman va undan qutulish uchun ba'zi maslahatlarni ham aytib beraman.

Async nima / do'zaxni kutadi

Asinxron JavaScript bilan ishlaganda, odamlar ko'pincha bir nechta bayonotlarni ketma-ket yozishadi va funktsiyani chaqirishdan oldin kutishadi. Bu unumdorlik bilan bog'liq muammolarni keltirib chiqaradi, chunki ko'p hollarda bitta ibora avvalgisiga bog'liq emas - ammo siz baribir oldingi hisobotni tugatilishini kutishingiz kerak.

Asinx / do'zaxni kutish misoli

Agar pizza va ichimlikka buyurtma berish uchun ssenariy yozgan bo'lsangiz, o'ylab ko'ring. Skript quyidagicha ko'rinishi mumkin:

Sirtda u to'g'ri ko'rinadi va u ishlaydi. Ammo bu yaxshi amalga oshirilmaydi, chunki u moslikni rasmda qoldiradi. Keling, muammoni echish uchun nima qilayotganini tushunaylik.

Izoh

Biz kodimizni asinx-IIFE-ga o'radik. Ushbu aniq tartibda quyidagilar yuzaga keladi:

  1. Pitssa ro'yxatini oling.
  2. Ichimliklar ro'yxatini oling.
  3. Ro‘yxatdan bitta pitsani tanlang.
  4. Ro‘yxatdan bitta ichimlikni tanlang.
  5. Tanlangan pitsani savatga qo'shing.
  6. Tanlangan ichimlikni aravaga qo'shing.
  7. Savatdagi narsalarni buyurtma qiling.

Xo'sh, nima noto'g'ri?

Yuqorida ta'kidlaganimdek, bu barcha bayonotlar birma-bir ijro etiladi. Bu erda moslik yo'q. Ehtiyotkorlik bilan o'ylab ko'ring: nega biz ichimliklar ro'yxatini olishga urinishdan oldin pitsza ro'yxatini olishni kutmoqdamiz? Biz shunchaki ikkala ro'yxatni bir joyga to'plashga harakat qilishimiz kerak. Biroq, biz pizza tanlashimiz kerak bo'lganida, biz oldindan pizzalar ro'yxatiga ega bo'lishimiz kerak. Ichimliklar uchun ham xuddi shunday.

Shunday qilib, pizza bilan bog'liq ishlar va ichimliklar bilan bog'liq ishlar parallel ravishda sodir bo'lishi mumkin, degan xulosaga kelishimiz mumkin, ammo pizza bilan bog'liq ishlarda individual bosqichlar ketma-ket (birma-bir) amalga oshirilishi kerak.

Yomon amalga oshirishning yana bir misoli

Ushbu JavaScript parchasi savatdagi narsalarni oladi va ularga buyurtma berish uchun so'rov yuboradi.

Bu holda, for loopi keyingi iteratsiyani davom ettirishdan oldin sendRequest () funktsiyasining bajarilishini kutishi kerak. Biroq, biz aslida kutishimiz shart emas. Biz barcha so'rovlarni iloji boricha tezroq yuborishni xohlaymiz va keyin ularning hammasini kutishimiz mumkin.

Umid qilamanki, endi siz asinxni nima ekanligini tushunishga yaqinlashmoqdasiz / do'zaxni kutmoqdasiz va bu sizning dasturingiz ishiga qanday ta'sir qiladi. Endi men sizga savol bermoqchiman.

Agar kutish kalit so'zini unutib qo'ysak nima bo'ladi?

Agar siz async funktsiyasini chaqirishda kutishni ishlatishni unutgan bo'lsangiz, funktsiya bajarishni boshlaydi. Bu shuni anglatadiki, funktsiyani bajarish uchun kutish shart emas. Async funktsiyasi keyinroq foydalanishingiz mumkin bo'lgan va'da beradi.

Yana bir natija shundaki, kompilyator siz funktsiyani to'liq bajarilishini kutishni xohlayotganingizni bilmaydi. Shunday qilib, kompilyator asinx vazifasini tugatmasdan dasturdan chiqadi. Shuning uchun bizga kutish uchun kalit so'z kerak.

Va'dalarning bir qiziq xususiyati shundaki, siz bitta satrda va'da berib, boshqasida hal qilinishini kutishingiz mumkin. Bu asinxdan qochishning / do'zaxni kutishning kalitidir.

Ko'rib turganingizdek, doSomeAsyncTask () va'da bermoqda. Ushbu vaqtda doSomeAsyncTask () uning ijro etilishi boshlandi. Va'daning hal qilingan qiymatini olish uchun biz kutish kalit so'zidan foydalanamiz va bu JavaScript-ni keyingi qatorni darhol bajarmaslik kerakligini aytadi, aksincha uning va'dasini kutib, keyingi qatorni bajarishni kutadi.

Asinxdan qanday chiqish / do'zaxni kutish kerak?

Asinxdan qochish / do'zaxni kutish uchun siz ushbu bosqichlarni bajarishingiz kerak.

Boshqa bayonotlarning bajarilishiga bog'liq bo'lgan iboralarni toping

Birinchi misolimizda biz pizza va ichimlikni tanlayotgandik. Pitsani tanlashdan oldin bizda pitssa ro'yxati bo'lishi kerak degan xulosaga keldik. Pitsani savatga qo'shmasdan oldin, biz pitssa tanlashimiz kerak. Shunday qilib, biz ushbu uchta bosqich bir-biriga bog'liq deb ayta olamiz. Oldingi narsani oxiriga etkazmagunimizcha, bitta narsani qila olmaymiz.

Ammo agar biz unga kengroq nazar tashlasak, biz pizza tanlash ichimlik tanlashga bog'liq emasligini aniqlaymiz, shuning uchun ularni parallel ravishda tanlashimiz mumkin. Bu mashinalar biznikidan yaxshiroq qila oladigan narsalardan biri.

Shunday qilib, biz boshqa bayonotlarning bajarilishiga bog'liq bo'lgan ba'zi va boshqa bo'lmagan bayonotlarni topdik.

Async funktsiyalarida guruhga bog'liq bo'lgan iboralar

Ko'rib turganimizdek, pitsani tanlash pitssa ro'yxatini olish, birini tanlash va aravaga tanlangan pitsani qo'shish kabi bog'liq bayonotlarni o'z ichiga oladi. Ushbu bayonotlarni async funktsiyasiga guruhlashimiz kerak. Shu tarzda ikkita asinx funktsiyani olamiz, SelectPizza () va SelectDrink ().

Ushbu async funktsiyalarini bir vaqtning o'zida bajaring

Ushbu async bloklamaydigan funktsiyalarni bir vaqtning o'zida ishlatish uchun biz voqea qatoridan foydalanamiz. Buni amalga oshirishning ikkita keng tarqalgan usuli bu va'dalarni erta qaytarish va Promise.all usuli.

Misollar keltiraylik

Uch bosqichdan so'ng, ularni bizning misollarimizga qo'llaylik.

Endi biz bayonotlarni ikkita vazifaga ajratdik. Funktsiya ichida har bir ibora oldingisining bajarilishiga bog'liq. Keyin biz SelectPizza () va SelectDrink () funktsiyalarini bir vaqtda bajaramiz.

Ikkinchi misolda biz noma'lum miqdordagi va'dalar bilan shug'ullanishimiz kerak. Ushbu vaziyatni hal qilish juda oson: biz shunchaki qator yaratamiz va undagi va'dalarni bajaramiz. Keyin Promise.all () dan foydalanib, biz barcha va'dalarning hal qilinishini kutamiz.

Umid qilamanki, ushbu maqola async / kutish asoslari haqida ma'lumot berishga yordam berdi va shuningdek, ilovangizning ish faoliyatini yaxshilashga yordam berdi.

Agar sizga maqola yoqqan bo'lsa, iltimos, qalbingizni lol qoldiring. Maslahat - Siz 50 marta chapak chalishingiz mumkin!

Iltimos, Fb va Twitter-da ham o'rtoqlashing. Agar siz yangilanishlarni olishni istasangiz, meni Twitter va Medium-da kuzatib boring yoki mening yangiliklarga obuna bo'ling! Agar biron bir narsa aniq bo'lmasa yoki biror narsani ko'rsatmoqchi bo'lsangiz, iltimos, quyida izohlang.