Assíncrono · unidade 23 de 27

Event loop

Prever a fila é prever o resultado.

9 min de leitura · 7 cards · 16 exercícios

Card 1 de 7: Event loop01 / 07

Leitura

Call stack, microtasks, timers, process.nextTick e a ordem que determina quando cada trecho realmente executa.

No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.

A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.

Código

exemplo.js
console.log("A")
setTimeout(() => console.log("B"), 0)
Promise.resolve().then(() => console.log("C"))
console.log("D")

// A, D, C, B

O que fica

  • Código síncrono termina antes de qualquer fila avançar.
  • Microtasks drenam antes da próxima fase de timers.
  • No Node, process.nextTick tem prioridade própria e pode causar starvation.

Prática guiada.Leia, rode, quebre e explique cada exercício.

Prática guiada / unidade 23

Um problema de cada vez.

Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.

Fundamentalexercício 01 / 16

syncBeforeAsync()

01 / Entenda

Enunciado

retorna uma Promise que resolve com um array mostrando a ordem: todo o código síncrono roda primeiro, depois uma microtask (Promise.then), depois uma macrotask (setTimeout). Resultado esperado: ["sync-start", "sync-end", "microtask", "timeout"].

02 / Implemente

Sua tentativa

Comece pela assinatura e resolva sem olhar a resposta.

ponto de partida
function syncBeforeAsync() {
  // Escreva sua solução aqui.
}

03 / Preveja

Entrada e saída

Use estes exemplos para entender o contrato antes de programar.

Entrada / chamada

syncBeforeAsync()

Retorno esperado

código síncrono roda antes de microtask e macrotask

04 / Teste

Prove que funciona

O teste chama sua função e compara o resultado real com o esperado.

Como utilizar este teste

  1. 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
  2. 02Salve sua implementação em exercises.js, na mesma pasta do teste.
  3. 03Abra o terminal nessa pasta e execute o comando abaixo.
  4. 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="syncBeforeAsync" exercises.test.js

Comportamentos cobertos

  • código síncrono roda antes de microtask e macrotask
Ver código completo do teste
test("syncBeforeAsync: código síncrono roda antes de microtask e macrotask", async () => {
  const order = await syncBeforeAsync();
  assert.deepEqual(order, ["sync-start", "sync-end", "microtask", "timeout"]);
});

Ainda travou?

Dicas graduais

Nível 1 — direção, sem código

Para syncBeforeAsync: se você escrevesse tudo em ordem de leitura no código (setTimeout antes do Promise.then, por exemplo), a ordem de execução seria a mesma da ordem de leitura? Por quê não?

Nível 2 — pista mais direta

syncBeforeAsync: use order.push(...) de forma síncrona duas vezes, agende setTimeout(() => order.push("timeout"), 0), agende Promise.resolve().then(() => order.push("microtask")), e resolva a Promise de retorno com um setTimeout cujo atraso seja maior que 0 (ex.: 10ms) para garantir que tanto a microtask quanto o timeout já rodaram.

05 / Compare

Resolução

Esta área permanece livre em todos os exercícios. O código atual da unidade aparece abaixo para comparação com os testes e casos esperados.
código disponível
function syncBeforeAsync() {
  throw new Error("not implemented: syncBeforeAsync");
}