Sobes.tech
Middle

Kaip sąveikaujate su įvykių ciklu (event loop)?

sobes.tech AI

Atsakymas iš AI

Aš tiesiogiai nesusijungiu su įvykių ciklu, tai yra JavaScript variklio vidinė mechanika (pavyzdžiui, V8 Node.js ir naršyklėse). Mano sąveika vyksta netiesiogiai, per asinchronines operacijas:

Pagrindinės sąlyčio taškai:

  • Laikmačiai: setTimeout, setInterval. Jie įkelia užduotis į atgalinės eilės, kurios bus vykdomos įvykių ciklo po laiko pabaigos.
  • Promečiai: Promise. Jų metodai (then, catch, finally) registruoja asinchroniškai vykdomus kolbekus į įvykių ciklo mikrotaskų eilę.
  • Asinchroninės įvesties-išvesties operacijos: Serverio užklausos (fetch, XMLHttpRequest), failų sistemos darbai Node.js. Jų pabaiga sukelia atitinkamų kolbekų įkėlimą į makrotaskų arba mikrotaskų eilę.
  • DOM įvykių tvarkytojai: addEventListener. Kolbekai vykdomi, kai įvykiai ciklas apdoroja DOM įvykį.

Pavyzdys naudojant promises asinchroninei operacijai:

// Asinchroninė funkcija
async function fetchData(url) {
  try {
    const response = await fetch(url); // Asinchroninė operacija
    if (!response.ok) {
      throw new Error(`HTTP klaida: ${response.status}`);
    }
    const data = await response.json(); // Asinchroninė operacija
    return data;
  } catch (error) {
    console.error('Klaida gaunant duomenis:', error);
    throw error; // Klaidos permetimas
  }
}

// Asinchroninės funkcijos kvietimas ir rezultatų apdorojimas
fetchData('https://api.example.com/data')
  .then(data => {
    console.log('Gauti duomenys:', data); // Šis kolbekas bus vykdomas asinchroniškai
  })
  .catch(error => {
    console.error('Įvyko klaida:', error); // Šis kolbekas bus vykdomas klaidos atveju
  });

console.log('Šis kodas bus vykdomas ANKSČIAU nei asinchroninės operacijos pabaiga.'); // Šis kodas sinchroninis

Supratimas apie įvykių ciklo veikimą padeda rašyti neblokiruojantį kodą, efektyviai valdyti asinchronines operacijas ir išvengti "sąsajos užšalimo". Aš žinau, kad ilgos sinchroninės operacijos blokuoja pagrindinį srautą ir įvykių ciklą, todėl stengiuosi jų vengti arba perkelti į web worker'us.