Si funksionon Loop Event në JavaScript?

Ndërsa mund të kërkojë një kuptim të thelluar të gjuhëve si C ++ dhe C për të shkruar kodin e prodhimit në shkallë të plotë, JavaScript shpesh mund të shkruhet vetëm me një kuptim themelor të asaj që mund të bëhet me gjuhën.


Konceptet, si kalimi i thirrjeve telefonike në funksione ose shkrimi i kodit asinkron, shpesh nuk janë aq të vështira për tu zbatuar, gjë që i bën shumë zhvilluesit e JavaScript të kujdesen më pak për atë që ndodh nën kapuç. Ata thjesht nuk kujdesen për të kuptuar kompleksitetet që kanë hequr thellësisht prej tyre nga gjuha.

Si një zhvillues i JavaScript, bëhet gjithnjë e më e rëndësishme të kuptosh se çfarë ndodh me të vërtetë nën kapuç dhe si funksionojnë shumica e këtyre kompleksiteteve të abstraktuara nga ne. Na ndihmon të marrim vendime më të informuara, të cilat, nga ana tjetër, mund të rrisin performancën e kodit tonë në mënyrë drastike.

Ky artikull përqendrohet në një nga konceptet ose termat shumë të rëndësishëm por të rrallë të kuptuar në JavaScript. LOOP NGJARJE!. 

Shkrimi i një kodi asinkron nuk mund të shmanget në JavaScript, por pse me të vërtetë nënkupton një kod që funksionon në mënyrë asinkron? i.e. Lak Ngjarje

Para se të kuptojmë se si funksionon lakja e ngjarjes, së pari duhet të kuptojmë se çfarë është vetë JavaScript dhe si funksionon!

Farë është JavaScript?

Para se të vazhdojmë, më pëlqen që ne të bëjmë një hap prapa në bazat e para. Whatfarë është në të vërtetë JavaScript? Ne mund të përcaktonim JavaScript si;

JavaScript është një gjuhë jo-bllokuese, asinkron, e njëkohshme e një niveli të lartë, të interpretuar, të vetëm me tela..

Prisni, çfarë është kjo? Një përkufizim librar? ��

Le ta copëtojmë!

Fjalët kyçe këtu në lidhje me këtë artikull janë vetme-ndërprerë, jo bllokues, i njëkohshëm, dhe josinkronik.

Fije e vetme

Një fije ekzekutimi është sekuenca më e vogël e udhëzimeve të programuara që mund të menaxhohet në mënyrë të pavarur nga një planifikues. Një gjuhë programuese është me një fije, do të thotë se mund të kryejë vetëm një detyrë ose operacion në një kohë të vetme. Kjo do të thotë se do të ekzekutonte një proces të tërë nga fillimi në fund, pa ndërprerë ose ndaluar fije.

Ndryshe nga gjuhët me shumë fije, ku shumë procese mund të zhvillohen në disa fije njëkohësisht, pa bllokuar njëra-tjetrën.

Si mund të JavaScript të jetë me një fije dhe jo-bllokimin në të njëjtën kohë?

Por çfarë do të thotë bllokimi?

Non-bllokimin

Nuk ka asnjë përkufizim të bllokimit; kjo thjesht do të thotë gjëra që po ngadalë kalojnë në fije. Pra, mos bllokimi nënkupton gjëra që nuk janë të ngadalta në fije.

Por prisni, a thashë se JavaScript shkon në një fije të vetme? Dhe unë gjithashtu thashë atë jo bllokues, që do të thotë detyra të zhvillohet shpejt në pirun e thirrjes? Por si ??? Po kur kemi ekzekutimin e kohëmatësve? Loops?

Relax! Ne do ta zbulojmë pak.

në harmoni

Konkurrencë do të thotë që kodi po ekzekutohet njëkohësisht nga më shumë se një fije.

Në rregull, gjërat po bëhen vërtet i çuditshëm tani, si mund të JavaScript të jetë me një fije dhe të jetë njëkohësisht? d.m.th., duke ekzekutuar kodin e tij me më shumë se një fije?

josinkronik

Programimi asinkron do të thotë që kodi funksionon në një lak të ngjarjeve. Kur ka një operacion bllokimi, ngjarja ka filluar. Kodi i bllokimit vazhdon të funksionojë pa bllokuar fillin kryesor të ekzekutimit. Kur kodi bllokues përfundon së funksionuari, ai është në radhë të rezultatit të operacioneve të bllokimit dhe i shtyn ato përsëri në rafte.

Por JavaScript ka një fije të vetme? Thenfarë ekzekuton më pas këtë kod bllokues ndërsa lejoni që kodet e tjera në fije të ekzekutohen?

Para se të vazhdojmë, le të kemi një përmbledhje të sa më sipër.

  • JavaScript është me një fije
  • JavaScript është jo bllokues, d.m.th. procese të ngadalta nuk e bllokojnë ekzekutimin e tij
  • JavaScript është njëkohësisht, d.m.th. ai ekzekuton kodin e tij në më shumë se një fije në të njëjtën kohë
  • JavaScript është asinkron, d.m.th. ai funksionon duke bllokuar kodin diku tjetër.

Por sa më sipër nuk shtohen saktësisht, si mundet që një gjuhë me një fije të jetë jo bllokuese, e njëkohshme dhe asinkron?

Le të shkojmë pak më thellë, le të zbresim tek motorët e funksionimit të JavaScript, V8, mbase ka disa fije të fshehura për të cilat nuk jemi të vetëdijshëm për.

Motori V8

Motori V8 është një motor i ekzekutimit të montimit me burim të hapur me burim të hapur për JavaScript i shkruar në C ++ nga Google. Shumica e shfletuesve drejtojnë JavaScript duke përdorur motorin V8, dhe madje edhe ambienti i ekzekutimit me nyje popullore js e përdor atë gjithashtu.

Në anglisht të thjeshtë, V8 është një program C ++, i cili merr kodin JavaScript, e përpilon dhe ekzekuton atë.

V8 bën dy gjëra madhore;

  • Alokimi i memorjes së grumbullimit
  • Konteksti i ekzekutimit të thirrjes së pirgut

Mjerisht, dyshimi ynë ishte i gabuar. V8 ka vetëm një pirg thirrjesh, mendoni për pirun e thirrjeve si fill.

Një fije === një thirrje pirg === një ekzekutim në një kohë.

Imazh – mesdita e hackerit

Meqenëse V8 ka vetëm një pirg thirrjesh, si atëherë JavaScript funksionon njëkohësisht dhe në mënyrë asinkron, pa bllokuar fillin kryesor të ekzekutimit?

Le të përpiqemi ta zbulojmë duke shkruar një kod të thjeshtë por asinkron por të zakonshëm dhe ta analizojmë së bashku.

JavaScript drejton çdo rresht kodi me radhë, njëri pas tjetrit (me një fije). Siç pritej, rreshti i parë shtypet në tastierë këtu, por pse është rreshti i fundit i shtypur përpara kodit të kohëzgjatjes? Pse procesi i ekzekutimit nuk pret kodin e kohës (bllokimin) përpara se të shkoni përpara për të drejtuar rreshtin e fundit?

Disa fije të tjera duket se na kanë ndihmuar të ekzekutojmë atë periudhë kohore pasi jemi shumë të sigurt që një fije mund të ekzekutojë vetëm një detyrë të vetme në çdo moment të kohës.

Le të bëjmë një vështrim të poshtër në V8 Kodi i Burimit për një kohë.

Prisni Çfarë??!!! Nuk ka funksione të kohëmatësit në V8, nuk ka DOM? Nuk ka ngjarje? Jo AJAX?…. Yeeeeessss!!!

Ngjarjet, DOM, kohëmatësit, etj. Nuk janë pjesë e zbatimit thelbësor të JavaScript, JavaScript përputhet rreptësisht me specifikimet e Skriptet Ecma dhe versionet e ndryshme të tij shpesh referohen sipas Specifikimeve të Scriptts Ecma të tij (ES X).

Rrjedha e Punës së Ekzekutimit

Ngjarjet, kohëmatësit, kërkesat e Ajax janë dhënë të gjitha në anën e klientit nga shfletuesit dhe shpesh referohen si Web API. Ata janë ata që lejojnë JavaScript me një fije të jetë jo bllokuese, e njëkohshme dhe asinkron! Por si?

Ekzistojnë tre seksione kryesore në rrjedhën e punës së ekzekutimit të çdo programi JavaScript, pirgun e thirrjeve, API-në e internetit dhe radhë Task.

Stacki i Thirrjeve

Një pirg është një strukturë e të dhënave në të cilën elementi i fundit i shtuar është gjithmonë i pari që hiqet nga rafte, ju mund të mendoni për atë si një pirg të një pllake në të cilën vetëm pllaka e parë që ishte shtimi i fundit mund të hiqet së pari. Një Stack i Thirrjeve nuk është asgjë tjetër veçse një strukturë e të dhënave pirg ku detyra ose kodi janë duke u ekzekutuar në përputhje me rrethanat.

Le ta shqyrtojmë shembullin e mëposhtëm;

Burimi – https://youtu.be/8aGhZQkoFbQ

Kur e quani funksionin printSquare (), shtyhet në pirgun e thirrjeve, funksioni printSquare () thërret funksionin katror (). Funksioni katror () shtyhet mbi pirg dhe gjithashtu thërret funksionin shumëzues (). Funksioni i shumëzimit shtyhet mbi pirg. Meqenëse funksioni i shumëzimit kthehet dhe është gjëja e fundit që u shty në rafte, zgjidhja e tij zgjidhet së pari dhe hiqet nga rafti, i ndjekur nga funksioni katror () dhe më pas funksioni printSquare ().

API i Uebit

Kjo është ajo ku kodi që nuk merret nga motori V8 është ekzekutuar për të mos “bllokuar” fijen kryesore të ekzekutimit. Kur Call Stack has një funksion API në internet, procesi menjëherë dorëzohet në API Web, ku po ekzekutohet dhe liron Call Stack për të kryer operacione të tjera gjatë ekzekutimit të tij.

Le të kthehemi te shembulli ynë i caktuarTimeout më lart;

Kur e drejtojmë kodin, linja e parë e tastierës.log shtrihet në pirg dhe marrim rezultatin pothuajse menjëherë, pasi të arrijmë në afatin kohor, kohëmatësit merren nga shfletuesi dhe nuk janë pjesë e zbatimit thelbësor të V8, është shtyrë në vend të API-së në Internet, duke çliruar pirgun në mënyrë që të mund të kryente operacione të tjera.

Ndërsa koha e përfundimit është akoma, pirg shkon përpara në rreshtin tjetër të veprimit dhe drejton tastierën e fundit.log, e cila shpjegon pse e fitojmë atë para daljes së kohëmatësit. Pasi të përfundojë kohëmatësi, diçka ndodh. Console.log në atë kohëmatësi magjike shfaqet përsëri në pirun e thirrjeve!

si?

Lak Ngjarje

Para se të diskutojmë lakin e ngjarjes, së pari le të kalojmë funksionin e radhës së detyrës.

Kthehu tek shembulli ynë i kohëzgjatjes, pasi API Web të përfundojë ekzekutimin e detyrës, ai jo vetëm që e shtyn automatikisht në Stack Call. Ajo shkon në Radha e detyrave. 

Një radhë është një strukturë e të dhënave që funksionon në parimin e Parë në Së pari, kështu që ndërsa detyrat futen në radhë, ato dalin me të njëjtin rend. Detyrat që janë ekzekutuar nga API-i i Web-it, të cilat janë shtyrë në Radhë Task, pastaj kthehuni te Call Stack për të nxjerrë rezultatin e tyre të shtypur.

Por prit. WHFAR HECK .SHT SHQYRTI I NGJARJES???

Burimi – https://youtu.be/8aGhZQkoFbQ

Lidhja e ngjarjes është një proces që pret që Call Stack të jetë i qartë përpara se të shtyni thirrjet e thirrjes nga radha e detyrave në thirrjen e thirrjeve. Sapo Stack është i qartë, lakja e ngjarjes nxit dhe kontrollon Radhë Task-u për lidhjet thirrëse në dispozicion. Nëse ka ndonjë, e shtyn atë në Stack të Thirrjeve, pret që Call Stack të jetë përsëri i qartë dhe përsërit të njëjtin proces.

Burimi – https://www.quora.com/How-does-an-event-loop-work/answer/Timothy-Maxwell

Diagrami i mësipërm tregon rrjedhën themelore të punës ndërmjet Lidhjes së Ngjarjes dhe Radhë e Detyrave.

përfundim

Ndërsa kjo është një hyrje shumë themelore, koncepti i programimit asinkron në JavaScript jep një pasqyrë të mjaftueshme për të kuptuar qartë se çfarë po ndodh nën kapuç dhe si JavaScript është në gjendje të funksionojë njëkohësisht dhe në mënyrë asinkron me vetëm një fije të vetme.

JavaScript është gjithmonë në kërkesë, dhe nëse jeni kurioz të mësoni, unë ju këshilloj ta shikoni këtë Kursi Udemy.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map