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.