Introduksjon til generatorer og Koa.js Del 1

Koa.js er et uttrykksfulle neste generasjons webramme skrevet for Node.js av folkene bak Express og Connect-rammene. Koa.js utnytter generatorer, som er en blødende kant funksjon av JavaScript, og har ennå ikke blitt gjort i stabile versjoner av Node.js. Koa tar sikte på å bruke generatorer for å redde utviklere fra spaghetti av tilbakeringinger, noe som gjør det mindre feilaktig og dermed mer overkommelig.

Med bare 550 kodelinjer er Koa et ekstremt lett rammeverk. Selv etter det pakker Koa seg i en elegant pakke med metoder som innholdsforhandlinger, omdirigeringer, proxy-support etc., noe som gir deg enkel og rask utvikling sammen med den granulære kontrollen over noden din.

Installere knutepunkt

Nå før vi begynner, må du ha minst Node-versjon 0.11.x eller større.

Du kan installere den nyeste versjonen av Node ved hjelp av N-modulen:

sudo npm installere -g n sudo n stable 

Du kan også bruke andre fellesskapsmoduler som nvm eller bygge den fra kilden. Vær oppmerksom på at N er også en fellesskapsmodul.

For å kjøre en JS-fil som bruker generatorer, må du oppgi --harmoni flagg når du kjører den.

For eksempel å kjøre app.js, skriv inn følgende kommando:

node --harmony app.js

Eller for å redde deg fra å skrive inn dette flagget hver gang, kan du opprette et alias ved hjelp av følgende kommando:

alias node = "node --harmony"

Nå for å kjøre din søknad ved hjelp av generatorer, bare skriv inn:

node app.js

Veldig bra! Vær også oppmerksom på at all koden i denne artikkelen er tilgjengelig på GitHub. Ta gjerne gaffel og lek med den.

For å forstå Koa må du først forstå generatorer som danner rammenes ryggrad.

Hva er generatorer?

Med ES-6 har generatorer endelig landet i det magiske landet til JavaScript. Hvis du har tidligere erfaring med generatorer i Lua, Python, Scheme, Smalltalk etc., så vil du være glad for å vite at en veldig lignende ting er implementert i JavaScript. 

 Generatorer er førsteklasses samrutiner i JavaScript som, enkelt sett, introduserer et pause og spillgrensesnitt på språket. Før generatorer brukte hele skriptet til som oftest Kjør i topp til nederst, uten en enkel måte å stoppe kodekjøring og gjenoppta med samme stabel senere. Nå kan vi få våre hender skitne med noen eksempler.

I henhold til dagens utkast til ES-6-spesifikasjon, må vi bruke en annen versjon av funksjonsdefinisjonen for å opprette en generatorfunksjon. Det ser slik ut:

var generator_func = funksjon * () ;

Her generator_func er bare en tom generatorfunksjon.

Så hva vi kan gjøre er å bruke utbytte søkeord i funksjonen for å stoppe kjøringen og lagre den nåværende stakken.

Her er et enkelt eksempel som viser summen av en uendelig AP:

var r = 3; funksjon * uendelig_ap (a) for (;;) a = a + r; gi a;  var sum = uendelig_ap (5); console.log (sum.next ()); // returnerer verdi: 8, ferdig: false console.log (sum.next ()); // returnerer verdi: 11, ferdig: falsk

I den ovennevnte koden oppretter vi i utgangspunktet en iterator-instans som heter infinite_ap som inkluderer en uendelig løkke og kan kjøre under normale forhold, kan fryse utførelsen.

Deretter lagrer vi en iterator forekomst i sum variabel.

Nå når vi ringer sum.next (), det kommer tilbake verdi: 8, ferdig: false noe som betyr at den stoppet utførelsen på utbytte uttalelse som returnerer verdi som 'a' og ferdig som "falsk" .

Her ferdig returnerer falsk til utførelsen er uferdig. Når utførelsen er fullført (i det nevnte tilfellet, skjer det aldri) funksjonen returnerer verdi: undefined, ferdig: true .

Her er en liten endring av den forrige koden for å demonstrere slutten av utførelsen:

var r = 3; funksjon * uendelig_ap (a) for (var i = 0; i < 3 ; i++)  a = a + r ; yield a;   var sum = infinite_ap(5); console.log(sum.next()); // returns  value : 8, done : false  console.log(sum.next()); // returns  value : 11, done: false  console.log(sum.next()); // returns  value : 14, done: false  console.log(sum.next()); //return  value: undefined, done: true  

I mer komplekse programmer, vil du sjekke og bruke verdiene returnert og ferdig status.

Merk: Ved hjelp av utbytte uten funksjon* ville føre til en tidlig feil.

Tilgjengelige generatorer Metoder

Her er noen vanlige metoder som kommer til nytte når du håndterer vanilje generatorer.

Hver av metodene nedenfor er bare tilgjengelig i en generatorfunksjon og vil kaste en feil ellers.

neste ()

Dette brukes til å gjenoppta utførelsen sammen med å sende et argument. Hvis ingenting er bestått, blir udefinert passert som det første argumentet.

Eksempel: sum.next (5);

kaste()

Dette brukes til å kaste en feil eller et unntak på et hvilket som helst trinn. Det gjør feilhåndtering mye enklere. Å kaste en feil kan resultere i å stoppe utførelsen av filen, hvis den ikke håndteres et sted. Den enkleste måten å håndtere en feil på er å bruke et forsøk og få tak i det. Denne metoden tar et enkelt argument som kan være noe.

Eksempel: sum.throw (ny feil ("dette er en feil")); 

delegere utbytte

Generator delegasjon brukes til å gi en generator fra en eksisterende generator og kan brukes til å komponere generatorer eller til og med deterere over en generator.

Ved å delegere til en annen generator, stopper den nåværende generatoren å produsere en verdi selv og begynner å gi verdier av den delegerte generatoren til den er oppbrukt. Ved utmattelse av den delegerte generatoren fortsetter generatoren å returnere sin egenverdi.

Det er veldig mye som å bruke a for i sløyfe over en generator, men unntakene fra den delegerte generatoren blir forplantet og kastet via den ytre generatorens kaste metode og bør håndteres på samme måte. Her er et eksempel:

var consoleLogThunk = funksjon (msg) return function () console.log (msg);  var generator = funksjon * () yield consoleLogThunk ("Yo"); gi konsollLogThunk ("Dawg"); gi konsollLogThunk ("!!!");  var delegator_function = funksjon * () yield consoleLogThunk ("Jeg ga før delegert utbytte"); utbytte * generator (); gi konsollLogThunk ("Jeg ga etter delegert avkastning");  var k = delegator_funksjon (); k.next () verdi (.); k.next () verdi (.); k.next () verdi (.); console.log (k.next ()); // Hvis du ringer k.next (), vil det kaste en Type-feil, da verdien er udefinert som ikke er en funksjon 

Nå som du har en kort forståelse av generatorer i Javascript, kan du bruke dem til å skrive mye klarere og mindre feilkrevende applikasjoner der du kan blokkere på I / O, uten å blokkere prosessen faktisk.. 

La oss nå gå videre til installasjonen av Koa og en veldig enkel applikasjon basert på Koa.js.

Koa.js:

Koa er et objekt som inneholder en rekke mellomvaregeneratorfunksjoner, som alle er sammensatt og utført på en stabelaktig måte ved hver forespørsel.

Installere Koa

I prosjektkatalogen, kjør følgende kommando.

npm installere koa - save

Koa blir automatisk lastet ned og lagret i en package.json fil, hvis den eksisterer.

Til tross for Koas meget små fotavtrykk, inneholder det metoder for oppgaver som cache friskhet, innholdsforhandlinger, omdirigeringer, proxy support etc., uten at middleware er pakket sammen.

Her er et eksempel hallo-verden program:

var koa = krever ('koa'); var app = koa (); app.use (funksjon * () this.body = "Hei verden!";); app.listen (3000);

Koas kontrollflow

Koa implementerer også downstreaming etterfulgt av oppstrømning av kontrollstrømmen. I begynnelsen kan det være vanskelig å gispe, men når du går gjennom eksemplet nedenfor, blir det tydeligere.

Her er et eksempel på kontrollflyten i Koa:

var koa = krever ('koa') (); koa.use (funksjon * (neste) // gjør noe før du gir / går videre til neste generatorfunksjon i kø som vil være første begivenhet i nedstrøms console.log ("A"); gi neste; // gjør noe når utførelsen returnerer oppstrøms, dette vil være siste hendelse i oppstrøms console.log ("B");); koa.use (funksjon * (neste) // gjør noe før du gir / går videre til neste generatorfunksjon i kø, dette skal være 2. begivenhet nedstrøms console.log ("C"); gi neste; // gjør noe når kjøringen returnerer oppstrøms, og dette ville være 2. begivenhet oppstrøms console.log ("D");); koa.use (funksjon * () // gjør noe før du gir / går videre til neste generatorfunksjon i kø. Her ville det være sist funksjon nedstrøms console.log ("E"); this.body = "hey guys"; konsoll .log ("F"); // Første forekomst av oppstrøms (fra siste til første)); koa.listen (3000); 

Koden ovenfor er ganske enkel. Merk at ikke alle console.log uttalelser er påkrevd, men de vil hjelpe deg å tydelig forstå den nedstrøms og oppstrøms utførelsesstrømmen til Koa.js .

Forstå eksemplene 'Execution Flow

Når vi kjører denne applikasjonen og åpner opp localhost: 3000 i nettleseren kan vi observere at console.logs i terminalen er ikke i størrelsesorden A B C D E F. De er heller ikke i rekkefølge av A-C-E-B-D-F.

Ordren er faktisk A-----B C E F D som skildrer nedstrømmen av utbytter og oppstrøms oppførsel av utførelsen i en Koa-app.

Det kan hende du merker at den skrives ut to ganger. Dette skyldes en dobbel forespørsel sendt av nettleseren for å hente favicon.

Tips: Den koa.use (funksjon) legger til mellomvarefunksjonen i programmet.

For å konkludere

Så det er det for del 1 av denne opplæringen på JavaScript generatorer og Koa.js. Du har lært om de fleste forutsetningene, for eksempel hvilke generatorer, hvordan du bruker dem, hvordan du bruker delegerende avkastning og hvordan kontrollflyten fungerer i Koa.js.

I neste del av denne opplæringen vil vi dykke dypere inn i Koa og lære å bygge en CRUD-applikasjon. Hvis du har spørsmål eller kommentarer, kan du kontakte meg eller bare slippe en kommentar nedenfor.