Gün 25 (həftə 5) - Növbəti () və sonrakı () qayıtmaq arasındakı incə fərq

Növbəti () və növbəti () qayıtmağın arasındakı fərqə gəlməzdən əvvəl günü yekunlaşdırmaq istərdim.

Normal Cümə Huddleimiz bəzi elanlar, karyera xidmətləri və irəliyə gedən plan haqqında bəzi məlumatlar və üzərində işlədiyimiz bir neçə təqdimatdan ibarət idi. Düşünən odur ki, kodumuzu təqdim etməklə kod haqqında danışmaqda daha yaxşı olur. Düşünürəm ki, bu, əla bir şeydir, yalnız bunu etmək üçün daha çox vaxtımız olmasını istərdim. İrəli sürdüyüm təkliflərdən biri də Github-da daha çox rəsmi kod icmalımızın olması və iş yerində digər insanların kodunu nəzərdən keçirmək və şərh etmək üçün istifadə edəcəyimiz eyni vasitələrdən istifadə etməyimizdir.

Müraciət etməkdə maraqlı olduğum şirkətlər üçün CV-lərim və qapalı məktublarım barədə təkbətək görüş keçirdim. Hər kəs bu qədər mütəşəkkildir və irəli gedən proses haqqında məlumatlıdır. Proqram inkişafında iş tapmaq üçün dərin təcrübə və bilik olduğunu söyləyə bilərəm. Ümidim odur ki, bu məlumatı götürüb bu təlimin sonunda iş tapmaqda istifadə edə bilərəm.

Yaxşı, növbəti () və növbəti () -ı geri çağırmağın fərqi barədə. Bunu ilk dəfə bir neçə gün əvvəl gecə ev tapşırıqlarında bəzi nümunə kodu işləyərkən gördüm. Marşrutları müəyyənləşdirmək üçün Express-dən istifadə edirik və gördüklərim bu kimi bir şeydi.

app.get ('/ post', funksiya (req, res, sonrakı) {
  Post.findById (1234) .then (funksiya (post, err) {
    əgər (səhv) {
      növbəti (err) qayıt;
    }
    əgər (! post) {
      var notFound = yeni səhv ('Yazılma tapılmadı!');
      notFound.status = 404;
      sonrakı qayıt (notFound);
    }
    res.send (post);
  });
});

Burada yolda / yazıda bir GET tələbi ilə işləyirik. Çağırış zamanı Post.findById-a bir növ zəng etdiyimiz görünür ki, bu da verilənlər bazasına sorğu edir. Çünki bu, bir verilənlər bazasına çatmağı və Sözü geri qaytarmağı əhatə edir. Xüsusilə, görürük ki, (səhv) doğrudursa, növbəti (err) qayıtmaq çağırışı edilir. Bunun ardınca başqa (! Yazı) başqa bir qayıdıb (notFound) gələn və nəhayət səhv etmədikdə və yazıda bəzi məlumatlar varsa, nəticəni göndərən res.send (post) deyirik. verilənlər bazası sorğusunu brauzerə geri göndərin.

Digər nümunələrdə bu kimi bir şey görərdim.

app.get ('/ foo',
funksiyanı yoxlamaqQeydiyyat (req, res, sonrakı) {
  əgər (! req.user.registred) {
    // İstifadəçi qeydiyyatdan keçməyibsə, növbəti marşruta keçin.
    // get Qeydiyyat icra olunmayacaq.
    sonrakı ('marşrut')
  }
}, getReg qeydiyyat (req, res, sonrakı) funksiyası {
  Qeydiyyat.find (funksiya (səhv, məlumat) {
    əgər (səhv) növbəti (err) qayıdırsa
    res.json (data)
  });
});

Bu nümunədə, sadəcə ('marşrut') a zəng edirik. Beləliklə, təbii sual budur ki, qayıdışdan istifadə ilə fərq nədir?

Bu gün kəşf etdiyim kimi, bir marşrutun içərisindəki növbəti () -ya zəng dərhal funksiyanı tərk etmir və növbəti marşruta keçmir. Bu vəziyyətdə, marşrutun qalan hissəsi qiymətləndirilir və növbəti () çağırıldığı üçün sorğunu həll etməyə ehtiyac yoxdur və sadəcə növbəti uyğun marşrut işleyicisinə keçə bilərik.

Bir qədər kənara çəkin: unutmayın ki, bir marşrut daxilində sorğunu həll etməsəniz, Express brauzerə heç nə göndərməyəcək və siz asılacaqsınız.

Beləliklə, bir marşrutun içərisindən növbəti () zəng etmək sadəcə Ekspressə deyir ki, marşrutun qalan hissəsi ilə davam edib növbəti uyğun marşruta keçməlidir.

Bir marşrut daxilində gələn () geri dönmə çağırışı ilə bunu müqayisə edin. Əhəmiyyətli fərq ondan ibarətdir ki, növbəti () geri qayıtdıqda, icra dərhal funksiyanı tərk edir və növbəti uyğun marşruta davam edir. Bu bir istisna atma davranışına bənzəyir. Marşrutumuzda bir şey baş verdi və marşrutda qalan hər hansı bir kodu atmaq və yalnız növbəti uyğun marşruta keçmək istəyirik.

Bu gün mənim problemim bütün istifadəçi adlarım və şifrələrimin tətbiqim üçün saxlanıldığı MongoDB-ya sorğu göndərməyə çalışmaqda idi. Müştərinin yeni təqdim etdiyi istifadəçi adı və şifrəsini alan POST sorğusuna gəldikdə, verilənlər bazasında uyğun bir qeydin olub olmadığını görmək üçün bir sorğu aparmaq lazımdır. Bu geri çağırış funksiyası olan asinxron bir zəngdir. Express'ə gəlincə, nəticənin verilənlər bazasından qayıtmasını gözləyərkən kodumu icra etməyə davam edir.

Bunun mənim üçün pis olduğunu ortaya çıxardı. Express məlumatların bazadan qayıtmasını gözlədiyindən, icra davam edir və bu səhv mesajını görməyə başlayıram.

Xəta: Göndərildikdən sonra başlıqlar təyin edilə bilmir.

Həqiqətən istəmədiyim zaman bu Express davam edir. Mən növbəti () istifadə edərək istədikdə növbəti () istifadə etmişdim.

Bunu anlamaq mənim üçün çox böyük oldu. Açıq döngəni bir neçə gün əvvəl iki zəngin fərqinin nə olduğuna dair təəccüblə tamamlamaq çox xoşdur. İndi bu layihə üçün geri dönüb kodumu təmizləyə bilərəm.

Son bir şey - yeni həftəlik layihə bu gün yayımlandı. Hangman'ın klassik oyununu oynamağa imkan verən bir veb səhifəni kodlaşdırmalıyıq. Mən bu həftə sonu ilə məşğul olacağam! :-)