Sobes.tech
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.