Desafio JavaScript
Simulador de event loop com filas
Enunciado
Implemente uma função simularEventLoop que recebe um array de tarefas e simula a ordem de execução do event loop. Cada tarefa é um objeto com tipo ('sync', 'micro', 'macro') e id. A função deve retornar um array com os ids na ordem em que seriam executados. Considere que todas as tarefas são agendadas no início e que não há novas tarefas criadas durante a execução.
Requisitos
- Processar todas as tarefas 'sync' primeiro, na ordem original
- Depois processar todas as 'micro' na ordem original
- Por último processar todas as 'macro' na ordem original
- Retornar um array com os ids na ordem de execução
Código inicial
function simularEventLoop(tarefas) {
// Seu código aqui
}
// Exemplo de uso:
const tarefas = [
{ tipo: 'macro', id: 'A' },
{ tipo: 'sync', id: 'B' },
{ tipo: 'micro', id: 'C' },
{ tipo: 'sync', id: 'D' },
{ tipo: 'micro', id: 'E' },
{ tipo: 'macro', id: 'F' }
];
console.log(simularEventLoop(tarefas)); // ['B', 'D', 'C', 'E', 'A', 'F']
Saída esperada
['B', 'D', 'C', 'E', 'A', 'F']
Ver dica
Separe as tarefas em três arrays por tipo, mantendo a ordem. Depois concatene na ordem: sync, micro, macro.
Mostrar solução
function simularEventLoop(tarefas) {
// Filtra tarefas síncronas, microtarefas e macrotarefas
const sync = tarefas.filter(t => t.tipo === 'sync').map(t => t.id);
const micro = tarefas.filter(t => t.tipo === 'micro').map(t => t.id);
const macro = tarefas.filter(t => t.tipo === 'macro').map(t => t.id);
// Concatena na ordem correta: sync, micro, macro
return [...sync, ...micro, ...macro];
}
// Teste
const tarefas = [
{ tipo: 'macro', id: 'A' },
{ tipo: 'sync', id: 'B' },
{ tipo: 'micro', id: 'C' },
{ tipo: 'sync', id: 'D' },
{ tipo: 'micro', id: 'E' },
{ tipo: 'macro', id: 'F' }
];
console.log(simularEventLoop(tarefas)); // ['B', 'D', 'C', 'E', 'A', 'F']
Passo a passo
- A função
simularEventLooprecebe um array de tarefas. - Usamos
filterpara separar as tarefas por tipo, mantendo a ordem original de cada grupo. - Mapeamos cada grupo para extrair apenas os
ids. - Concatenamos os arrays na ordem: primeiro
sync, depoismicro, por últimomacro. - Retornamos o array resultante.
- O teste com o exemplo mostra a ordem correta: síncronos primeiro, depois microtarefas, depois macrotarefas.
Por que funciona
A simulação reflete a prioridade do event loop: tarefas síncronas são executadas imediatamente, microtarefas têm prioridade sobre macrotarefas. Como todas as tarefas são agendadas no início, a ordem dentro de cada fila é preservada (FIFO).
Erros comuns
- Não preservar a ordem original dentro de cada tipo: Usar
sortoureverseacidentalmente. - Misturar micro e macro: Lembrar que microtarefas vêm antes de macrotarefas.
- Esquecer de mapear para
id: Retornar objetos em vez de strings.
Outra forma de resolver
Usar reduce para agrupar em um objeto:
function simularEventLoop(tarefas) {
const grupos = tarefas.reduce((acc, t) => {
acc[t.tipo] = acc[t.tipo] || [];
acc[t.tipo].push(t.id);
return acc;
}, {});
return [...(grupos.sync || []), ...(grupos.micro || []), ...(grupos.macro || [])];
}
Essa abordagem é útil se houver muitos tipos de tarefas.
Saída esperada
['B', 'D', 'C', 'E', 'A', 'F']