Sobes.tech
Middle

Como você interage com o ciclo de eventos (event loop)?

sobes.tech IA

Resposta da IA

Eu não interajo diretamente com o ciclo de eventos, pois é uma mecânica interna do motor JavaScript (por exemplo, V8 no Node.js e navegadores). Minha interação ocorre indiretamente, através de operações assíncronas.

Os principais pontos de contato:

  • Temporizadores: setTimeout, setInterval. Eles colocam tarefas na fila de callbacks, que serão executadas pelo ciclo de eventos após o tempo passar.
  • Promises: Promise. Seus métodos (then, catch, finally) registam callbacks que são executados de forma assíncrona nas microtarefas do ciclo de eventos.
  • Operações de entrada/saída assíncronas: Requisições ao servidor (fetch, XMLHttpRequest), trabalho com o sistema de ficheiros no Node.js. A sua conclusão provoca a colocação de callbacks correspondentes na fila de macro ou micro tarefas.
  • Manipuladores de eventos DOM: addEventListener. Os callbacks dos manipuladores são executados quando o ciclo de eventos processa um evento ocorrido no DOM.

Exemplo de uso de promises para uma operação assíncrona:

// Função assíncrona
async function fetchData(url) {
  try {
    const response = await fetch(url); // Operação assíncrona
    if (!response.ok) {
      throw new Error(`Erro HTTP: ${response.status}`);
    }
    const data = await response.json(); // Operação assíncrona
    return data;
  } catch (error) {
    console.error('Erro ao obter dados:', error);
    throw error; // Re-throw
  }
}

// Chamada da função assíncrona e manipulação do resultado
fetchData('https://api.example.com/data')
  .then(data => {
    console.log('Dados recebidos:', data); // Este callback será executado de forma assíncrona
  })
  .catch(error => {
    console.error('Ocorreu um erro:', error); // Este callback será executado em caso de erro
  });

console.log('Este código será executado ANTES de as operações assíncronas terminarem.'); // Código síncrono

Compreender como funciona o event loop ajuda-me a escrever código não bloqueante, gerir eficientemente operações assíncronas e evitar que a interface do utilizador congele. Tenho em conta que operações síncronas longas bloqueiam o thread principal e o ciclo de eventos, por isso tento evitá-las ou movê-las para web workers.