Middle
Come interagisci con il ciclo degli eventi (event loop)?
sobes.tech AI
Risposta dell'AI
Non interagisco direttamente con il ciclo di eventi, poiché è una meccanica interna del motore JavaScript (ad esempio, V8 in Node.js e browser). La mia interazione avviene indirettamente, attraverso operazioni asincrone.
I principali punti di contatto:
- Timer:
setTimeout,setInterval. Mettono i task in coda, che vengono eseguiti dal ciclo di eventi dopo il tempo trascorso. - Promesse:
Promise. I loro metodi (then,catch,finally) registrano callback che vengono eseguiti asincronamente nelle microtask del ciclo di eventi. - Operazioni di input/output asincrone: Richieste al server (
fetch,XMLHttpRequest), lavoro con il filesystem in Node.js. La loro conclusione provoca l'inserimento di callback corrispondenti nella coda di macro o micro task. - Gestori di eventi DOM:
addEventListener. I callback dei gestori vengono eseguiti quando il ciclo di eventi processa un evento avvenuto nel DOM.
Esempio di utilizzo delle promesse per un'operazione asincrona:
// Funzione asincrona
async function fetchData(url) {
try {
const response = await fetch(url); // Operazione asincrona
if (!response.ok) {
throw new Error(`Errore HTTP: ${response.status}`);
}
const data = await response.json(); // Operazione asincrona
return data;
} catch (error) {
console.error('Errore nel recupero dei dati:', error);
throw error; // Rilancia
}
}
// Chiamata della funzione asincrona e gestione del risultato
fetchData('https://api.example.com/data')
.then(data => {
console.log('Dati ricevuti:', data); // Questo callback verrà eseguito asincrono
})
.catch(error => {
console.error('Si è verificato un errore:', error); // Questo callback verrà in caso di errore
});
console.log('Questo codice verrà ESEGUITO PRIMA che le operazioni asincrone siano completate.'); // Codice sincrono
Capire come funziona l'event loop mi aiuta a scrivere codice non bloccante, a gestire efficacemente le operazioni asincrone e a evitare che l'interfaccia utente si blocchi. Tengo presente che operazioni sincrone lunghe bloccano il thread principale e il ciclo di eventi, quindi cerco di evitarle o di spostarle nei web worker.