25-kun (5-hafta) - Keyingi () va orqaga qaytish () o'rtasidagi nozik farq

Keyingi () va keyingi () ga qo'ng'iroq qilish o'rtasidagi farqni aniqlashdan oldin, kunni umumlashtirmoqchiman.

Bizning odatiy Juma Huddle ba'zi e'lonlar, martaba xizmatlari va ba'zi oldinga siljish rejalari haqida ma'lumot va biz ishlagan bir nechta taqdimotlardan iborat edi. Bizning fikrimizni taqdim etish orqali biz kod haqida gaplashishni yaxshilaymiz. O'ylaymanki, bu juda yaxshi narsa, biz bunga ko'proq vaqt sarflashni istardim. Oldinga siljish bo'yicha mening takliflarimdan biri - Github-da rasmiy kodlarni ko'rib chiqish, biz ish joyida boshqa odamlarning kodlarini ko'rib chiqish va izohlashda ishlatiladigan asboblarni ishlatishni o'rganish.

O'zimning rezyumeim to'g'risida yakka-yakka uchrashuv o'tkazdim va men murojaat qilmoqchi bo'lgan kompaniyalar uchun xatlarga murojaat qildim. Hamma shunday tartibli va oldinga siljish haqida xabardor. Dasturiy ta'minotni ishlab chiqishda qanday qilib ish topish haqida chuqur tajriba va bilim borligini ayta olaman. Umid qilamanki, men ushbu ma'lumotni olib, ushbu trening oxirida ish topishda foydalana olaman.

Keyingi () va keyingi (() ni chaqirish o'rtasidagi farq haqida. Buni birinchi marta bir necha kun oldin tungi uy vazifalaridagi ba'zi bir kod kodlari orqali ishlayotganda payqadim. Yo'nalishlarni aniqlash uchun biz Express-dan foydalanmoqdamiz va men ko'rgan narsalar shunga o'xshash edi.

app.get ('/ post', funktsiya (req, res, keyingi) {
  Post.findById (1234) .then (funktsiya (post, err) {
    agar (xato) {
      return next (err);
    }
    agar (! post) {
      var notFound = yangi xato ('Xabar topilmadi!');
      notFound.status = 404;
      return next (notFound);
    }
    res.send (post);
  });
});

Bu erda biz yo'lda / postda GET so'rovini ko'rib chiqmoqdamiz. Qo'ng'iroqni qaytarishda biz Post.findById-ga biron bir qo'ng'iroqni amalga oshirayotganimiz ko'rinadi, ehtimol bu ma'lumotlar bazasiga so'rov. Chunki bu ma'lumotlar bazasi bilan bog'lanish va va'da berishni qaytarishni o'z ichiga oladi .Shundan keyin aniq - bu funktsiyaning ichkarisiga qarang. Xususan, agar biz (xato) to'g'ri bo'lsa, keyingi (err) ga qaytish uchun qo'ng'iroq qilinganligini ko'ramiz. Shundan so'ng bizda yana bir (! Post) bor, u yana (notFound) qaytadi va nihoyat agar biz biron bir xato qilmagan bo'lsak va unda ba'zi ma'lumotlar mavjud bo'lsa, natijani yuboradigan res.send (post) deb nomlaymiz. ma'lumotlar bazasi so'rovini brauzerga qaytaring.

Boshqa misollarda men shunga o'xshash narsani ko'rardim.

app.get ('/ foo',
Check CheckRegging (req, res, next) {
  if (! req.user.registr) {
    // Agar foydalanuvchi ro'yxatdan o'tmagan bo'lsa, keyingi yo'lga o'ting.
    // getRegistratsiya bajarilmaydi.
    keyingisi ('marshrut')
  }
}, getRegistratsiya funktsiyasi (req, res, next) {
  Ro'yxatdan o'tish.find (funktsiya (xato, ma'lumotlar) {
    if (err) return next (err)
    res.json (ma'lumotlar)
  });
});

Ushbu misolda biz shunchaki ('marshrut') ga qo'ng'iroq qilamiz. Shunday qilib, tabiiy savol: qaytib kelishni qo'llashning farqi nimada?

Bugun bilganimdek, marshrut ichidagi keyingi () ga qo'ng'iroq darhol funktsiyani tark etmaydi va keyingi marshrutga o'tmaydi. Bunday holda, marshrutning qolgan qismi baholanadi va keyingi () deb nomlanganligi sababli, so'rovni hal qilishning hojati yo'q va biz shunchaki keyingi mos keladigan marshrutni qayta ishlov beruvchiga o'tamiz.

Tez chetga surib qo'ying: agar siz so'rovni marshrut ichida hal qilmasangiz, Express brauzerga hech narsa yubormasligini va sizni osib qo'yishingizni unutmang.

Shunday qilib, marshrut ichidan keyingi () raqamiga qo'ng'iroq qilish shunchaki Expressga marshrutning qolgan qismini davom ettirish va keyingi mos keladigan marshrutga o'tish kerakligini aytadi.

Buni marshrut ichidagi keyingi () ga qo'ng'iroq qilish bilan solishtiring. Muhim farq shundaki, keyingi () ga qo'ng'iroq qilganingizda, ijro darhol funktsiyani tark etadi va keyingi mos keladigan marshrutga o'tadi. Bu istisno otish xatti-harakatlariga o'xshaydi. Yo'nalishimizda biron bir narsa yuz berdi va biz marshrutda qolgan kodni o'tkazib yubormoqchimiz va shunchaki keyingi mos keladigan marshrutga o'tmoqchimiz.

Mening muammoim MongoDB-ga so'rov yuborishga urinishda edi, bu erda mening barcha foydalanuvchi ismlarim va parollarim ilovam uchun saqlanadi. Mijoz o'zi taqdim etgan foydalanuvchi nomi va parolini olgan POST so'roviga murojaat qilganimda, ma'lumotlar bazasida bir-biriga mos yozuvlar bor-yo'qligini bilish uchun so'rovni ishga tushirishim kerak. Bu qayta qo'ng'iroq qilish funktsiyasi bilan asenkron qo'ng'iroq. Expressga kelsak, u ma'lumotlar bazasidan qaytib kelishini kutib, mening kodimni bajarishda davom etadi.

Bu men uchun yomon ekanligini bildiradi. Express ma'lumotlar bazasidan qaytib kelishini kutayotganligi sababli, ijro etish davom etmoqda va men bu xato haqidagi xabarni ko'rishni boshlayman.

Xato: Yuborilganidan keyin sarlavhalarni o'rnatib bo'lmadi.

Men buni chindan ham xohlamaganimda bu Express tezligi davom etadi. Men return next () ni ishlatishni xohlaganimda, keyingi () ni ishlatgan edim.

Bugun buni anglash men uchun juda katta edi. Ikkala qo'ng'iroqning farqi nimada ekanligiga hayron bo'lib, bir necha kun oldin ochilgan tsiklni yakunlash juda yoqimli. Men hozir qaytib, ushbu loyiha uchun kodimni tozalashim mumkin.

So'nggi bir narsa - yangi haftalik loyiha bugun chiqdi. Hangmanning klassik o'yinini o'ynashga imkon beradigan veb-sahifani kodlashimiz kerak. Men bu hafta oxiri bilan shug'ullanaman! :-)