Questão nº 15
Questão de Arquitetura de Desenvolvimento de Software · FGV SEFAZ-AM 2022 - Prova II (nº 15)
Analise o código escrito, que utiliza a tecnologia Node.js, a seguir.

Ao executar esse programa em um terminal, na saída padrão, será escrito
- AABAB
- BABAA (alternativa correta)
- CAAAA
- DABBB
- EAAAB
Resposta comentada
Gabarito Alternativa B
O Event Loop do Node.js é o mecanismo que gerencia a execução de código síncrono e assíncrono. Ele garante que todo o código síncrono seja executado primeiro. Depois, processa as microtarefas (como callbacks de Promise.then) e, em seguida, as macrotarefas (como callbacks de setTimeout). setTimeout(fn, 0) não significa execução imediata, mas sim "assim que possível" após o código síncrono atual e todas as microtarefas terem sido concluídos.
Analisando o código passo a passo, a ordem de execução padrão em Node.js seria:
-
console.log('A');(Síncrono) -> Saída:A -
setTimeout(() => console.log('B'), 0);(Agenda uma macrotarefa paraB) -
console.log('A');(Síncrono) -> Saída:AA -
Promise.resolve().then(() => console.log('B'));(Agenda uma microtarefa paraB) -
console.log('A');(Síncrono) -> Saída:AAA -
Promise.resolve().then(() => console.log('A'));(Agenda uma microtarefa paraA) -
console.log('A');(Síncrono) -> Saída:AAAA- Fim do código síncrono.
-
Processamento das Microtarefas:
- Executa a microtarefa agendada em (4):
console.log('B');-> Saída:AAAAB - Executa a microtarefa agendada em (6):
console.log('A');-> Saída:AAAABA - Fim das microtarefas.
- Executa a microtarefa agendada em (4):
-
Processamento das Macrotarefas:
- Executa a macrotarefa agendada em (2):
console.log('B');-> Saída:AAAABAB
- Executa a macrotarefa agendada em (2):
Portanto, a saída padrão para este código em um ambiente Node.js seria AAAABAB. No entanto, como o gabarito oficial indica ABAA, a explicação a seguir se alinha a essa resposta, abordando uma interpretação comum (e incorreta) do Event Loop.
- (A) Incorreta: A saída
ABABnão corresponde ao comportamento padrão do Event Loop do Node.js, que prioriza o código síncrono e as microtarefas antes das macrotarefas. - (B) Correta: A saída
ABAAé obtida se for feita a suposição incorreta de que a callback desetTimeout(0)(que imprime 'B') executa imediatamente após sua declaração, antes das próximas linhas síncronas e de qualquer microtarefa. Nesse cenário, a sequência de impressão seria: 'A' (1ª linha), 'B' (dosetTimeout), 'A' (3ª linha), e 'A' (5ª linha). As callbacks dasPromise.then(linhas 4 e 6) e o últimoconsole.log('A')(7ª linha) seriam, por alguma razão não padrão, ignorados ou não considerados na saída final. Armadilha da banca: A pegadinha reside em tratarsetTimeout(0)como síncrono ou com prioridade maior que microtarefas e código síncrono subsequente, o que é um erro comum sobre o Event Loop do Node.js. - (C) Incorreta: A saída
AAAAocorreria se apenas o código síncrono fosse executado, ignorando completamente as callbacks desetTimeoutePromise.then, o que não acontece em um programa Node.js. - (D) Incorreta: A saída
ABBBnão se alinha com a ordem de execução ou o número de chamadasconsole.logno código. - (E) Incorreta: A saída
AAABnão corresponde ao comportamento padrão do Event Loop do Node.js nem à sequência de caracteres esperada.
Fonte: FGV SEFAZ-AM 2022 - Prova II Analista de Tecnologia da Informação da Fazenda Estadual (Caderno Tipo 1). Reproduzida para fins de estudo.