Middle
Cum interacționați cu bucla de evenimente (event loop)?
sobes.tech AI
Răspuns de la AI
Nu interacționez indirect cu bucla de evenimente, deoarece aceasta este o mecanică internă a motorului JavaScript (de exemplu, V8 în Node.js și browsere). Interacțiunea mea are loc prin operații asincrone.
Punctele principale de contact:
- Temporizatoare:
setTimeout,setInterval. Acestea plasează sarcini în coada de callback-uri, care sunt executate de bucla de evenimente după expirarea timpului. - Promisiuni:
Promise. Metodele lor (then,catch,finally) înregistrează callback-uri care sunt executate asincron în microtask-urile buclei de evenimente. - Operații asincrone de intrare/ieșire: Cereri către server (
fetch,XMLHttpRequest), lucru cu sistemul de fișiere în Node.js. Finalizarea lor determină plasarea callback-urilor corespunzătoare în coada de macro sau microtask-uri. - Handleri de evenimente DOM:
addEventListener. Callback-urile handler-ilor sunt executate atunci când bucla de evenimente procesează un eveniment survenit în DOM.
Exemplu de utilizare a promisiunilor pentru o operație asincronă:
// Funcție asincronă
async function fetchData(url) {
try {
const response = await fetch(url); // Operație asincronă
if (!response.ok) {
throw new Error(`Eroare HTTP: ${response.status}`);
}
const data = await response.json(); // Operație asincronă
return data;
} catch (error) {
console.error('Eroare la obținerea datelor:', error);
throw error; // Aruncă din nou
}
}
// Apelarea funcției asincrone și procesarea rezultatului
fetchData('https://api.example.com/data')
.then(data => {
console.log('Date primite:', data); // Acest callback va fi executat asincron
})
.catch(error => {
console.error('A apărut o eroare:', error); // Acest callback va fi executat în caz de eroare
});
console.log('Acest cod va fi executat ÎNAINTE ca operațiile asincrone să se finalizeze.'); // Cod sincron
Înțelegerea modului în care funcționează bucla de evenimente mă ajută să scriu un cod non-blocant, să gestionez eficient operațiile asincrone și să evit ca interfața utilizatorului să se blocheze. Țin cont că operațiile sincronice lungi blochează firul principal și bucla de evenimente, așa că încerc să le evit sau să le mut în web workers.