Introducere în Generatoare & Koa.js Partea 1

Koa.js este un cadru web generativ de generație următoare, scris pentru Node.js de către oamenii din spatele rapoartelor Express și Connect. Koa.js utilizează generatoarele, care reprezintă o caracteristică de sângerare a JavaScript, și nu au fost încă realizate în versiuni stabile ale Node.js. Koa intenționează să utilizeze generatoare pentru a salva dezvoltatorii din spaghetele apelurilor de apel, ceea ce face mai puțin predispusă la erori și, prin urmare, mai ușor de gestionat.

Cu doar 550 de linii de cod, Koa este un cadru extrem de ușor. Chiar și după aceea, Koa se îmbină într-o suită elegantă de metode cum ar fi negocierea conținutului, redirecționări, suport proxy etc., oferindu-vă ușurință și viteză de dezvoltare împreună cu controlul granular asupra aplicației dumneavoastră nod.

Instalarea nodului

Acum, înainte de a începe, va trebui să aveți cel puțin nodul 0.11.x sau mai mare.

Puteți instala cea mai recentă versiune de Nod folosind modulul N:

sudo npm instalare -g n sudo n stabil 

De asemenea, puteți utiliza alte module ale comunității, cum ar fi nvm, sau o puteți construi din sursă. Rețineți că N este, de asemenea, un modul comunitar.

Pentru a rula un fișier JS care utilizează generatoare, trebuie să furnizați --armonie semn când îl rulați.

De exemplu, pentru a rula app.js, introduceți următoarea comandă:

nod - charmony app.js

Sau pentru a vă salva de la intrarea în acest steag de fiecare dată, puteți crea un alias utilizând următoarea comandă:

alias node = "nod - armonia"

Acum, pentru a rula aplicația folosind generatoare, introduceți doar:

nod app.js

Foarte bine! De asemenea, rețineți că tot codul din acest articol este disponibil pe GitHub. Simțiți-vă liber la furculiță și jucați cu el.

Acum, pentru a înțelege Koa, trebuie să înțelegeți mai întâi generatorii care formează coloana vertebrală a cadrului.

Ce sunt generatoarele??

Cu ES-6, generatoarele au ajuns în final în terenul magic al JavaScript. Dacă aveți experiență anterioară cu generatoare în Lua, Python, Schema, Smalltalk etc., atunci vă veți bucura să știți că un lucru foarte asemănător a fost implementat în JavaScript. 

 Generatoarele sunt co-rutine de primă clasă în JavaScript, care, pur și simplu, introduc o interfață de pauză și de redare în limba respectivă. Înainte de generatoare, tot scenariul obișnuia de obicei executați într-o ordine de sus în jos, fără o modalitate ușoară de a opri executarea de cod și de a relua cu același stiva mai târziu. Acum permiteți-mi să ne murdărim mâinile cu câteva exemple.

În conformitate cu actuala versiune a proiectului ES-6, trebuie să folosim o versiune diferită a definiției funcției pentru a crea o funcție a generatorului. Se pare ca aceasta:

var gener_func = funcție * () ;

Aici generator_func este doar o funcție a generatorului gol.

Deci, ceea ce putem face este să folosim Randament cuvânt cheie în funcție pentru a opri execuția și pentru a salva stiva curentă.

Iată un exemplu simplu care demonstrează Suma unui AP infinit:

var r = 3; funcția * infinite_ap (a) pentru (;;) a = a + r; randamentul a;  var sum = infinite_ap (5); console.log (sum.next ()); // returnează value: 8, done: false console.log (sum.next ()); // returnează value: 11, done: false

În codul de mai sus, inițial creăm o instanță iterator numită infinite_ap care include o buclă infinită și dacă funcționează în condiții normale, poate îngheța executarea.

Apoi stocăm o instanță iterator în sumă variabil.

Acum când sunăm sum.next (), se întoarce valoare: 8, făcut: fals ceea ce înseamnă că a încetat executarea acestuia pe Randament declarație care returnează valoare ca "a" și Terminat ca "fals" .

Aici Terminat returnează false până când execuția este neterminată. Odată ce execuția este completă (în cazul menționat mai sus, nu se întâmplă niciodată) funcția revine valoare: undefined, done: true .

Iată o mică modificare a codului anterior pentru a demonstra sfârșitul execuției:

var r = 3; funcția * infinite_ap (a) pentru (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  

În programe mai complexe, veți verifica și utiliza valorile returnate și Terminat stare.

Notă: Utilizarea Randament fără funcţie* ar duce la o eroare timpurie.

Metode de generare disponibile

Iată câteva metode comune care vor veni la îndemână atunci când vă ocupați cu generatoare de vanilie.

Fiecare dintre metodele de mai jos este disponibilă numai într-o funcție a generatorului și ar arunca altfel o eroare.

Următor →()

Aceasta este folosită pentru a relua execuția împreună cu trecerea unui argument. Dacă nu se trece nimic, atunci este nedefinit ca primul argument.

Exemplu: sum.next (5);

arunca()

Acest lucru este folosit pentru a arunca o eroare sau o excepție la orice pas. Face mult mai ușor tratarea erorilor. Aruncarea unei erori poate duce la oprirea executării fișierului, dacă nu este manipulat undeva. Cea mai simplă metodă de a gestiona o eroare este utilizarea unei instrucțiuni de încercare și de captură. Această metodă ia un singur argument, care poate fi orice.

Exemplu: sum.throw (eroare nouă ("aceasta este o eroare")); 

delegând Randament

Generarea delegației este utilizată pentru a genera un generator dintr-un generator existent și poate fi utilizată pentru a compune generatoare sau chiar a itera pe un generator.

La delegarea la un alt generator, generatorul de curent oprește producerea unei valori în sine și începe să producă valori ale generatorului delegat până când acesta este epuizat. După epuizarea generatorului delegat, generatorul revine la revenirea propriei valori.

Seamănă foarte mult cu a pentru-in buclă peste un generator, dar excepțiile generatorului delegat sunt propagate și aruncate prin intermediul generatorului exterior arunca și trebuie tratate în mod similar. Iată un exemplu:

var consoleLogThunk = funcție (msg) funcția return () console.log (msg);  var generator = funcție * () yield consoleLogThunk ("Yo"); consola de randamentLogThunk ("Dawg"); consola de randamentLogThunk ("!!!");  var delegator_function = funcția * () console de randamentLogThunk ("am cedat înainte de randamentul delegat"); randament * generator (); consola de randamentLogThunk ("am obținut după randamentul delegat");  var k = delegator_funcția (); k.next () valoare (.); k.next () valoare (.); k.next () valoare (.); console.log (k.next ()); // Dacă apelați k.next (), va arunca o eroare de tip, deoarece valoarea este nedefinită, care nu este o funcție 

Acum că aveți o scurtă înțelegere a generatoarelor în Javascript, le puteți folosi pentru scrierea unor aplicații mult mai clare și mai puțin greșite, unde puteți bloca pe I / O, fără a bloca procesul. 

Să trecem acum la instalarea lui Koa și o aplicație foarte simplă bazată pe Koa.js.

Koa.js:

Koa este un obiect care conține o serie de funcții ale generatorului middleware, toate fiind compuse și executate într-o manieră asemănătoare stivei la fiecare solicitare.

Instalarea Koa

În directorul de proiect, executați următoarea comandă.

npm instalează koa --save

Koa va fi descărcat automat și salvat în package.json fișier, dacă există.

În ciuda amprentei foarte mici a lui Koa, aceasta include metode pentru sarcini cum ar fi prospețimea cache-ului, negocierea conținutului, redirecționări, suport proxy etc., fără ca middleware-ul să fie inclus în.

Iată un exemplu de aplicație hello-world:

var koa = necesită ("koa"); var app = koa (); app.use (funcția * () this.body = "Hello World !!!";); app.listen (3000);

Fluxul de control al Koa

AcumKoa implementează, de asemenea, downstreaming, urmată de avansarea fluxului de control. La început, poate fi greu să respirați, dar odată ce treceți prin exemplul de mai jos, lucrurile vor deveni mai clare.

Iată un exemplu de flux de control în Koa:

var koa = cer ('koa') (); koa.use (funcția * (următoarea) // face ceva înainte de a da / transmite către următoarea funcție a generatorului în linie care va fi primul eveniment în consola în jos ("A"); revine în amonte, acesta va fi ultimul eveniment din consola.log ("B");); koa.use (functie * (urmatoarea) // face ceva inainte de a da / transmite catre urmatoarea functie a generatorului in linie, acesta va fi al doilea eveniment in consola.log ("C"); execuția se întoarce în amonte și acest lucru ar fi al doilea eveniment consolă consola.log ("D");); koa.use (funcția * () // face ceva înainte de a da / transmite către următoarea funcție generator în linie.Aici ar fi ultima funcție în jos console.log ("E"); this.body = "hei guys"; consola .log ("F"); // Primul eveniment din amonte (de la ultimul la primul)); koa.listen (3000); 

Codul de mai sus este destul de simplu. Rețineți că nu toate console.log sunt necesare declarații, dar acestea vă vor ajuta să înțelegeți în mod clar fluxul de execuție în jos și în amonte al Koa.js .

Înțelegerea fluxului de execuție a exemplelor

Când executam această aplicație și ne deschidem localhost: 3000 în browser, putem observa că console.logs în terminal nu sunt în ordinea de A-B-C-D-E-F. Nici nu sunt în ordinea A-C-E-B-D-F.

Ordinea este de fapt A-C-E-F-D-B care descrie în aval randamentele și comportamentul în amonte al executării într-o aplicație Koa.

S-ar putea să observați că este imprimat de două ori. Acest lucru se datorează unei solicitări duble trimise de browser pentru a prelua faviconul.

Bacsis: The koa.use (funcția) adaugă funcția middleware la aplicație.

In concluzie

Deci asta este pentru prima parte a acestui tutorial despre generatoare JavaScript și Koa.js. Ați învățat despre majoritatea premiselor, cum ar fi ce sunt generatoarele, cum să le folosiți, cum să utilizați randamentul de delegare și cum funcționează fluxul de control în Koa.js.

În următoarea parte a acestui tutorial, ne vom arunca mai adânc în Koa și vom învăța cum să construim o aplicație CRUD. Dacă aveți întrebări sau comentarii, nu ezitați să mă contactați sau să faceți un comentariu de mai jos. 

Cod