Dagur 25 (vika 5) - Fíngerður munur á næsta () og aftur næsta ()

Áður en ég kemst að mismuninum á milli þess að hringja næst () og snúa aftur næst (), langar mig að draga daginn saman.

Hinn venjulegi föstudagshuddle okkar samanstóð af nokkrum tilkynningum, smá upplýsingum um starfsferil og áætlun um framvindu og nokkrar kynningar á verkefnum sem við höfðum unnið að. Hugsunin er sú að með því að kynna kóðann okkar verðum við betri í að tala um kóða. Ég held að þetta sé frábært að gera, ég vildi aðeins að við hefðum meiri tíma til að gera það. Ein af tillögum mínum sem halda áfram er að við erum með fleiri opinberar kóðaúttektir á Github til að æfa okkur með því að nota sömu tæki sem við munum líklegast nota á vinnustaðnum til að fara yfir og gera athugasemdir við kóða annarra.

Ég átti líka fínan einn-á-mann fund um ferilskrána og kynningarbréf fyrir fyrirtækin sem ég hef áhuga á að sækja um. Allir eru svo skipulagðir og upplýstir um ferlið sem gengur áfram. Ég get sagt að það er mikil reynsla og þekking á því hvernig eigi að finna starf í hugbúnaðarþróun. Von mín er sú að ég geti tekið þær upplýsingar og notað þær til að finna vinnu í lok þessarar þjálfunar.

Allt í lagi, að munurinn á því að hringja næst () og snúa næst (). Ég tók fyrst eftir þessu fyrir nokkrum dögum þegar ég vann í gegnum einhvern dæmi kóða í heimanámi. Við erum að nota Express til að skilgreina leiðir og það sem ég sá var eitthvað á þessa leið.

app.get ('/ staða', fall (req, res, næst) {
  Post.findById (1234) .then (fall (staða, skjátlast) {
    ef (skjátlast) {
      snúa aftur næst (skjátlast);
    }
    ef (! staða) {
      var notFound = ný Villa ('Færsla fannst ekki!');
      notFound.status = 404;
      snúa aftur næst (notFound);
    }
    res.send (staða);
  });
});

Hér erum við að afgreiða GET beiðni um leið / færslu. Í svarhringingu virðist sem við hringjum í einhvers konar Post.findById sem er líklega fyrirspurn í gagnagrunninn. Vegna þess að þetta felur í sér að ná í gagnagrunn og skila loforði - sem er skýrt af notkun .then - skulum líta inn í þá aðgerð. Sérstaklega sjáum við að ef (skjátlast) er satt, er hringt til að snúa aftur næst (skjátlast). Í framhaldi af því erum við með annan ef (! Staða) sem aftur skilar aftur næst (notFound), og að lokum ef við fengum enga villu og staða hefur einhver gögn í því, þá hringjum við í res.send (staða) sem sendir niðurstöðuna fyrirspurn gagnagrunnsins aftur í vafrann.

Í öðrum dæmum myndi ég sjá eitthvað á þessa leið.

app.get ('/ foo',
fallskoðun Skráning (beiðni, endurr., næst) {
  ef (! req.user.registered) {
    // Ef notandi hefur ekki skráð sig, slepptu yfir á næstu leið.
    // getRegistration verður ekki framkvæmt.
    næsta ('leið')
  }
}, virka getRegistration (be., res, next) {
  Registration.find (fall (skjátöl, gögn) {
    ef (skjátlast) aftur næst (skjátlast)
    res.json (gögn)
  });
});

Í þessu dæmi hringjum við bara í næsta ('leið'). Svo náttúrulega spurningin er hver er munurinn á því að nota aftur eða ekki?

Það kemur í ljós, eins og ég uppgötvaði í dag, að símtal við næstu () innan leiðar fer EKKI strax frá aðgerðinni og heldur áfram á næstu leið. Í þessu tilfelli er afgangurinn af leiðinni metinn og vegna þess að næst () var kallað til, er engin þörf á að leysa beiðnina og við getum einfaldlega haldið áfram til næsta leiðarstjóra.

Skjótt til hliðar: mundu að ef þú leysir ekki beiðnina innan leiðar mun Express ekki senda neitt aftur í vafrann og þú verður látinn hanga.

Svo að hringja næst () innan leiðar segir einfaldlega Express að það eigi að halda áfram með það sem eftir er af leiðinni og fara svo yfir á næstu samsvarandi leið.

Andstæður þessu með því að hringja til baka næst () innan leiðar. Mikilvægur munur er sá að þegar hringt er til baka næst (), þá lýkur framkvæmd aðgerðinni strax og heldur áfram á næstu samsvarandi leið. Þetta er svipað og hegðunin að henda undantekningu. Eitthvað hefur gerst á leiðinni okkar og við viljum sleppa öllum kóða sem eftir eru í leiðinni og hoppa bara yfir á næstu samsvarandi leið.

Mál mitt í dag var að reyna að keyra fyrirspurn til MongoDB þar sem öll notendanöfn mín og lykilorð eru geymd fyrir forritið mitt. Þegar ég kom að POST beiðninni, sem fékk notandanafn og lykilorð sem viðskiptavinurinn var nýbúinn að senda, þarf ég að keyra fyrirspurn til að sjá hvort það er samsvarandi skrá í gagnagrunninum. Þetta er ósamstillt símtal með svarhringingu. Hvað Express varðar heldur það áfram að keyra kóðann minn meðan ég bíður eftir að niðurstaðan komi aftur úr gagnagrunninum.

Kemur í ljós að þetta er slæmt fyrir mig. Þar sem Express bíður eftir gögnum til að koma aftur úr gagnagrunninum heldur framkvæmd áfram og ég fer að sjá þessi villuboð.

Villa: Ekki hægt að stilla haus eftir að þau eru send.

Þetta er Express sem heldur áfram þegar ég vildi það ekki. Ég var búinn að nota næst () þegar ég vildi endilega nota aftur næst ().

Að átta mig á þessu í dag var gríðarlegt fyrir mig. Það er gaman að ljúka opinni lykkjunni frá því fyrir nokkrum dögum og velta fyrir sér hver munurinn er á símtölunum tveimur. Ég get nú farið aftur og hreinsað kóðann minn fyrir þetta verkefni.

Einn síðasti hluturinn - nýja vikulega verkefnið kom út í dag. Við verðum að kóða vefsíðu sem gerir þér kleift að spila klassíska leikinn af Hangman. Ég mun glíma við það um helgina! :-)