JavaScript este limba web. Și nu a fost la fel de când a fost lansat ES5. Tot mai multe idei și caracteristici sunt portate din diferite limbi și sunt integrate în JavaScript.

Una dintre aceste caracteristici sunt Promisiunile, care sunt probabil cea mai utilizată funcție în JavaScript după lansarea ES5.

Dar unul dintre lucrurile pe care JavaScript le lipsește este o modalitate de a „întrerupe” execuția pentru o vreme și de a o relua mai târziu. În această postare, voi discuta despre modul în care puteți realiza acest lucru și ce înseamnă cu adevărat „întrerupeți” sau „dormiți” în JavaScript.

Spoiler: JavaScript nu se „întrerupe” niciodată.

TL; DR

Iată codul copy-paste care face treaba:

/**
 * 
 * @param duration Enter duration in seconds
 */
function sleep(duration) {
	return new Promise(resolve => {
		setTimeout(() => {
			resolve()
		}, duration * 1000)
	})
}

Dar ce se întâmplă cu adevărat aici?

setTimeout și promisiuni false

Să vedem un exemplu rapid folosind fragmentul de mai sus (vom discuta ce se întâmplă mai târziu):

async function performBatchActions() {
	// perform an API call
	await performAPIRequest()

	// sleep for 5 seconds
	await sleep(5)

	// perform an API call again
	await performAPIRequest()
}

Această funcție performBatchActions, atunci când este apelat, execută pur și simplu performAPIRequest funcție, așteaptă aproximativ 5 secunde, și apoi apelează din nou aceeași funcție. Rețineți cum am scris aproximativ 5 secunde, și nu 5 secunde.

O notă puternică de pus acolo: codul de mai sus nu garantează un somn perfect. Înseamnă că dacă specificați durata să fie, să zicem, 1 secundă, JavaScript nu garantează că va începe să ruleze codul după somn exact după 1 secundă.

De ce nu? s-ar putea să întrebi. Din păcate, se datorează faptului că temporizatoarele funcționează în JavaScript și, în general, în bucle de evenimente. Cu toate acestea, JavaScript garantează absolut că fragmentul de cod după somn nu se va executa niciodată inainte de timpul specificat.

Deci nu avem cu adevărat o situație complet nedeterminată, ci doar una parțială. Și, în majoritatea cazurilor, se află doar la o marjă de câteva milisecunde.

JavaScript are un singur fir

Un singur fir înseamnă că un proces JavaScript nu poate ieși deloc din drum. Trebuie să facă toate lucrurile – de la ascultători de evenimente, la apeluri HTTP, pe același fir principal. Și când un lucru se execută, altul nu poate executa.

Luați în considerare o pagină web în care aveți mai multe butoane și rulați codul de mai sus pentru a simula un somn pentru, să zicem, 10 secunde. Ce vrei să se întâmple?

Nimic. Pagina dvs. de internet va funcționa foarte bine, butoanele dvs. vor fi receptive și, odată ce repausul de 10 secunde este finalizat, codul de lângă acesta se va executa. Deci, este evident că JavaScript nu blochează cu adevărat întregul fir principal, deoarece dacă ar face acest lucru, pagina dvs. web ar fi înghețat și butoanele ar fi devenit non-clicabile.

Deci, cum a făcut JavaScript într-adevăr să întrerupă un singur fir, fără să-l întrerupă cu adevărat?

Faceți cunoștință cu Bucla evenimentului

Spre deosebire de alte limbi, JavaScript nu continuă să execute codul într-un mod liniar de sus în jos. Este un limbaj asincron condus de evenimente cu tone de magie sub forma buclei evenimentului.

O buclă de evenimente împarte codul dvs. în evenimente sincronizate și anumite – cum ar fi cronometre și solicitări HTTP. Exact vorbind, există două cozi – o coadă de sarcini și o coadă de microtare.

Ori de câte ori rulați JS și există un lucru asincron (cum ar fi un eveniment cu mouse-ul sau o promisiune), JavaScript îl aruncă în coada de sarcini (sau în coada de microtare) și continuă să se execute. Când finalizează o „bifă unică”, verifică dacă cozile de sarcini și coada de microtare au ceva de lucru. Dacă da, atunci va executa apelul invers / va efectua o acțiune.

Aș recomanda cu adevărat oricui este interesat de funcționarea detaliată a buclelor evenimentului să vizioneze acest videoclip:

Concluzie

Ați venit aici pentru o instrucțiune simplă de somn în JavaScript și ați ajuns să aflați despre unul dintre lucrurile esențiale din JavaScript – bucle de evenimente! Uimitor, nu-i așa?

Ei bine, dacă ți-a plăcut articolul, plătește codedamn – o platformă pe care am creat-o pentru dezvoltatori și cursanți ca tine. De asemenea, să ne conectăm pe social media – stare de nervozitate și Instagram. Ne vedem în curând!

Pace