TameJs – o extensie Javascript pentru lucrul cu evenimente
0 Tame (sau „TameJs”) este o extensie pentru Javascript, scrisă tot în Javascript, ce promite simplificarea programării evenimentelor – practic Tame ne ajută să scriem, citim şi să modificăm evenimentele în Javascript mult mai uşor. Este foarte simplu de folosit cu Node.JS sau alte proiecte ce au la bază engine-ul V8. Mai mult decât atât, poate fi inclus în proiecte oriunde dorim, fără a fi necesară rescrierea codului.
Tame poate fi găsit pe GitHub, alături de câteva notiţe lăsate de dezvoltatorii lui, cei de la OkCupid care au învăţat de-a lungul anilor foarte multe lucruri prin proiectele ambiţioasele ce le-au dezvoltat.
Eu i-am văzut o utilitate foarte mare în dezvoltarea aplicaţiilor asincrone şi în procesarea de informaţii în paralel. Pentru a vă demonstra logica din spatele TameJS, mă voi folosi chiar de exemplele oferite de ei.
Problema
Când Angel o vede pe Buffy
• Află scorul potrivirii celor doi
• Cere următoarea partidă pentru Angel
• Înregistrează vizita lui Angel şi află când s-a întâmplat acest lucru ultima dată
• Trimite-i un e-mail lui Buffy că Angel s-a uitat la ea, doar dacă :
– se potrivitesc destul de bine şi
– nu s-au uitat unul la celălalt recent
Varianta pre-asincronă
Nu este foarte complicat de înţeles codul de mai jos, defapt este chiar foarte clar că rezolvă problema propusă.
handleVisit : function(angel, buffy) { var match_score = getScore(angel, buffy); var next_match = getNextMatch(angel); var visit_info = recordVisitAndGetInfo(angel, buffy); if (match_score > 0.9 && ! visit_info.last_visit) { sendVisitorEmail(angel, buffy); } doSomeFinalThings(match_score, next_match, visit_info); }
O variantă asincronă obişnuită
Pentru un dezvoltator de nivel mediu-ridicat, codul de mai jos nu pare foarte dificil, dar trebuie privit în perspectivă pentru a realiza că pentru o problemă destul de simplă, asincronia ne-a forţat să facem compromisuri asupra lizibilităţii codului. Ar putea apărea probleme în cadrul revizuirilor codului sau atunci când trebuie implementat ceva nou, probleme ce ar duce la deficite la optimizarea resurselor umane.
handleVisit : function(angel, buffy) { getScore(angel, buffy, function(match_score) { getNextMatch(angel, function(next_match) { recordVisitAndGetInfo(angel, buffy, function(visit_info) { if (match_score > 0.9 && ! visit_info.last_visit) { sendVisitorEmail(angel, buffy); } doSomeFinalThings(match_score, next_match, visit_info); }); }); }); }
Varianta asincronă, folosind TameJS
Codului nu numai că este mai uşor de înţeles, dar este şi mult mai rapid pentru că toate apelurile au loc în paralel iar abia după ce toate trei sunt executate, firul execuţiei este înaintat.
handleVisit : function(angel, buffy) { // executam toate 3 in paralel twait { getScore (angel, buffy, mkevent(var score)); getNextMatch (angel, buffy, mkevent(var next)); recordVisitAndGetInfo (angel, buffy, mkevent(var vinfo)); } // acum avem datele necesare if (score > 0.9 && ! vinfo.last_visit) { sendVisitorEmail(angel, buffy); } doSomeFinalThings(score, next, vinfo); }
Mai multe informaţii despre această librărie puteţi găsi chiar pe site-ul oficial.