Dita 25 (java 5) - Diferenca delikate midis ardhshëm () dhe kthimit tjetër ()

Para se të arrij në ndryshimin midis thirrjes tjetër () dhe kthimit tjetër (), do të doja ta përmbledh ditën.

Huddle jonë e Premte normale përbëhej nga disa njoftime, disa informacione rreth shërbimeve të karrierës dhe planit që ecën përpara, dhe disa prezantime të projekteve për të cilat ne kemi punuar. Mendimi është që duke prezantuar kodin tonë, ne kemi më mirë të flasim për kod. Unë mendoj se kjo është një gjë e shkëlqyeshme për të bërë, vetëm dëshiroj të kishim më shumë kohë për ta bërë atë. Një nga sugjerimet e mia që ecin përpara është që ne të kemi më shumë rishikime të kodeve zyrtare në Github për të praktikuar duke përdorur të njëjtat mjete që me shumë mundësi do t'i përdorim në vendin e punës për të rishikuar dhe komentuar mbi kodin e njerëzve të tjerë.

Unë gjithashtu kam pasur një takim të bukur një për një në lidhje me rinisjen time dhe letrat e mbuluara për kompanitë për të cilat jam i interesuar të aplikoj. Të gjithë janë kaq të organizuar dhe të informuar në lidhje me procesin që ecën përpara. Mund të them që ka përvojë dhe njohuri të thella se si të gjejnë punë në zhvillimin e softuerit. Shpresa ime është që unë mund të marr atë informacion dhe ta përdor atë për të gjetur një vend pune në fund të këtij trajnimi.

Mirë, në ndryshimin midis thirrjes tjetër () dhe kthimit tjetër (). E kam parë për herë të parë disa ditë më parë kur punoja përmes ndonjë kodi shembullor në detyrat e shtëpisë së natës. Ne jemi duke përdorur Express për të përcaktuar rrugët, dhe ajo që pashë ishte diçka e tillë.

app.get ('/ posti', funksioni (req, rez, tjetër) {
  Post.findById (1234) .the (funksion (post, gabim) {
    nëse (gabim) {
      kthehu tjetër (gabim);
    }
    nëse (! postimi) {
      var notFound = Gabim i ri ('Postimi nuk u gjet!');
      notFound.status = 404;
      kthehu tjetër (joFound);
    }
    res.send (post);
  });
});

Këtu jemi duke trajtuar një kërkesë GET në rrugën / postimin. Në përgjigjen e thirrjes, duket se ne bëjmë një lloj thirrje në Post.findById e cila me siguri është një pyetje për bazën e të dhënave. Sepse kjo nënkupton arritjen e një baze të dhënash dhe kthimin e një Premtimi - i cili është i qartë nga përdorimi i. Në mënyrë të veçantë, ne shohim që nëse (gabimi) është i vërtetë, bëhet një thirrje për t'u kthyer tjetër (gabim). Pas kësaj kemi edhe një tjetër nëse (! Post) i cili përsëri bën një kthim tjetër (jo të plotë), dhe në fund të fundit nëse nuk kemi marrë ndonjë gabim dhe postimi ka disa të dhëna në të, ne e quajmë res.send (post) i cili dërgon rezultatin e pyetjes së bazës së të dhënave përsëri në shfletuesin.

Në shembuj të tjerë, do të shihja diçka të tillë.

app.get ( '/ foo',
kontrolli i funksionitRregjistrimi (req, res, tjetër) {
  në qoftë se (! req.user.registered) {
    // Nëse përdoruesi nuk ka regjistruar, kaloni në rrugën tjetër.
    // getRegistration nuk do të ekzekutohet.
    tjetër ( 'rrugë')
  }
}, funksioni getRegjistrimi (req, res, tjetër) {
  Regjistrimi.find (funksioni (gabim, të dhëna)) {
    nëse (gaboni) ktheheni tjetër (gabim)
    res.json (dhënave)
  });
});

Në këtë shembull, ne thjesht bëjmë një thirrje për në tjetrën ('rrugë'). Pra, pyetja natyrale është cili është ndryshimi midis përdorimit të kthimit apo jo?

Rezulton, siç kam zbuluar sot, se një telefonatë për në vazhdim () brenda një itinerari NUK e lë menjëherë funksionin dhe vazhdon në rrugën tjetër. Në këtë rast, pjesa e mbetur e itinerarit vlerësohet dhe për shkak se u thirr (tjetër) () u thirr, nuk ka nevojë për të zgjidhur kërkesën dhe ne thjesht mund të kalojmë në kontrolluesin e rrugës tjetër.

Shpejt mënjanë: mbani mend që nëse nuk e zgjidhni kërkesën brenda një itinerari, Express nuk do të dërgojë asgjë në shfletuesin dhe do të lihet i varur.

Kështu që, thirrja tjetër () nga brenda një itinerari thjesht i thotë Expressit se duhet të vazhdojë me pjesën e mbetur të rrugës dhe më pas të kalojë në rrugën tjetër që përputhet.

Kontrastoni këtë me thirrjen e kthimit tjetër () nga brenda një itinerari. Dallimi thelbësor është se kur e quani kthimin tjetër (), ekzekutimi menjëherë lë funksionin dhe shkon në rrugën tjetër të përputhjes. Kjo është e ngjashme me sjelljen e hedhjes së një përjashtimi. Diçka ka ndodhur në rrugën tonë dhe ne duam të kalojmë çdo kod të mbetur në rrugë dhe thjesht të hidhemi në rrugën tjetër që përputhet.

Problemi im sot ishte në përpjekjen për të drejtuar një pyetje në MongoDB ku të gjithë emrat e përdoruesve dhe fjalëkalimet e mia janë ruajtur për aplikacionin tim. Kur arrita te kërkesa POST, e cila mori emrin e përdoruesit dhe fjalëkalimin që klienti sapo kishte paraqitur, më duhet të drejtoj një pyetje për të parë nëse ekziston një rekord përputhen në bazën e të dhënave. Kjo është një telefonatë asinkron me një funksion kthyesie. Sa i përket Express, ajo vazhdon të ekzekutojë kodin tim ndërsa pret që rezultati të kthehet nga baza e të dhënave.

Rezulton se kjo është e keqe për mua. Meqenëse Express po pret që të dhënat të kthehen nga baza e të dhënave, ekzekutimi vazhdon dhe unë filloj ta shoh këtë mesazh gabimi.

Gabim: Nuk mund të vendosni header pasi të dërgohen.

Kjo është Express duke vazhduar më tej kur me të vërtetë nuk e dëshiroja. Unë kisha qenë duke përdorur tjetër () kur me të vërtetë doja të përdorja kthimin tjetër ().

Realizimi i kësaj sot ishte shumë e madhe për mua. Shtë mirë të plotësoni lakin e hapur nga disa ditë më parë duke menduar se cili është ndryshimi në dy telefonatat. Tani mund të kthehem dhe të pastroj kodin tim për këtë projekt.

Një gjë e fundit - projekti i ri i përjavshëm u publikua sot. Ne kemi nevojë për të koduar një faqe në internet që ju lejon të luani lojën klasike të Xhelat. Do të merremi me këtë fundjavë! :-)