/** * Parte 1 — Ordem de execução. * * Antes de ler a saída, escreva em um papel a ordem em que você espera que as * seis linhas apareçam. Depois rode: * * npx tsx src/01-ordem-execucao.ts * * O objetivo não é decorar a ordem, é entender a regra que a produz: o código * síncrono roda até o fim, as microtasks esvaziam em seguida, e só então a * primeira macrotask é atendida. */ console.log('1 — síncrono, primeira linha'); setTimeout(() => { console.log('5 — macrotask (setTimeout com 0 ms)'); }, 0); void Promise.resolve().then(() => { console.log('3 — microtask (then de uma promise já resolvida)'); }); queueMicrotask(() => { console.log('4 — microtask (queueMicrotask)'); }); console.log('2 — síncrono, última linha'); /** * Duas regras explicam a saída inteira. * * 1. As duas microtasks saem na ordem em que foram **registradas**, não pelo * mecanismo que as registrou: `then` veio antes de `queueMicrotask` no * arquivo, e sai antes na tela. Elas compartilham a mesma fila. * 2. O `setTimeout` com 0 ms não pede execução imediata: pede que a função * seja enfileirada como macrotask assim que possível. Enquanto houver * microtask pendente, a fila de macrotasks não é tocada — e é por isso que * a linha 5 chega por último, mesmo com o timer pedindo zero. */