Questão nº 15

Questão de Arquitetura de Desenvolvimento de Software · FGV SEFAZ-AM 2022 - Prova II (nº 15)

FGV2022Analista de Tecnologia da Informação da Fazenda EstadualArquitetura de Desenvolvimento de Software
Gabarito: Bver comentário ↓

Analise o código escrito, que utiliza a tecnologia Node.js, a seguir.

Figura da questão de Arquitetura de Desenvolvimento de Software

Ao executar esse programa em um terminal, na saída padrão, será escrito

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:

  1. console.log('A'); (Síncrono) -> Saída: A

  2. setTimeout(() => console.log('B'), 0); (Agenda uma macrotarefa para B)

  3. console.log('A'); (Síncrono) -> Saída: AA

  4. Promise.resolve().then(() => console.log('B')); (Agenda uma microtarefa para B)

  5. console.log('A'); (Síncrono) -> Saída: AAA

  6. Promise.resolve().then(() => console.log('A')); (Agenda uma microtarefa para A)

  7. console.log('A'); (Síncrono) -> Saída: AAAA

    • Fim do código síncrono.
  8. 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.
  9. Processamento das Macrotarefas:

    • Executa a macrotarefa agendada em (2): console.log('B'); -> Saída: AAAABAB

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 ABAB nã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 de setTimeout(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' (do setTimeout), 'A' (3ª linha), e 'A' (5ª linha). As callbacks das Promise.then (linhas 4 e 6) e o último console.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 tratar setTimeout(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 AAAA ocorreria se apenas o código síncrono fosse executado, ignorando completamente as callbacks de setTimeout e Promise.then, o que não acontece em um programa Node.js.
  • (D) Incorreta: A saída ABBB não se alinha com a ordem de execução ou o número de chamadas console.log no código.
  • (E) Incorreta: A saída AAAB nã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.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho