Pular para o conteúdo principal

Questão de Programação — Linguagens de programação — FGV 2023

ProgramaçãoLinguagens de programação
Código
fg071518
Banca
FGV
Órgão
TCE-SP
Ano
2023
Nível
Médio
Cargo
Auxiliar Técnico da Fiscalização - TI
Tatiana está efetuando a manutenção de uma página, e para testar a execução de uma função assíncrona em JavaScript, utilizou a escrita no documento, via método writeln, como no fragmento de código a seguir.const fatorial = async(a) => {let b = a;while(--a>0) b*=a;return b;}document.writeln(Fat 5: ${fatorial(5)});Tatiana esperava verificar a impressão do fatorial de cinco, mas o que viu foi [object Promise]. Tatiana resolveu o problema, alterando a escrita no documento para:
  1. Adocument.writeln('Fat 5: '+fatorial(5));
  2. Bdocument.writeln(Fat 5: ${await fatorial(5)});
  3. Cx = fatorial(5) => document.writeln(Fat 5: ${x});
  4. Dawait document.writeln(Fat 5: ${fatorial(5)});
  5. Efatorial(5).then(x=>document.writeln(Fat 5: ${x})).
Revelar gabarito e comentário

GabaritoE — fatorial(5).then(x=>document.writeln(`Fat 5: ${x}`)).

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Funções Assíncronas em JavaScript

Gabarito: letra E. A função fatorial é declarada como async, portanto retorna uma Promise. Ao chamar fatorial(5) sem aguardar a resolução, o valor exibido é a string [object Promise]. Para obter o resultado do cálculo, é necessário encadear o método .then() na Promise, que recebe o valor resolvido e o escreve no documento. A alternativa E faz exatamente isso.

Em JavaScript, funções marcadas com async sempre retornam uma Promise, independentemente de haver await interno. Para acessar o valor resolvido, existem duas formas:

  • Usar await dentro de uma função async (ou no top-level de módulos ES).

  • Usar o método .then() na Promise.

Fora de uma função async ou de um módulo, await não é válido. Por isso a alternativa B está incorreta.

  1. 1Função async retorna Promise
  2. 2Chamar sem await → [object Promise]
  3. 3Solução: .then() ou await
  4. 4.then() funciona em script comum
  5. 5await só dentro de async/module
LEVEL · soulevel.com.br

Alternativa A — ❌ Incorreta

Concatena a string com o retorno da função, que é uma Promise. O resultado será 'Fat 5: [object Promise]'.

Alternativa B — ❌ Incorreta

Tenta usar await diretamente em um script comum (não módulo), o que causa um erro de sintaxe (await só é permitido dentro de funções async). Mesmo que funcionasse, seria uma forma menos adequada, mas o erro principal é sintático.

Alternativa C — ❌ Incorreta

Sintaxe inválida: x = fatorial(5) => document.writeln(...) não é uma arrow function válida. O correto seria usar .then() ou await.

Alternativa D — ❌ Incorreta

await não pode ser usado em document.writeln() diretamente, e além disso document.writeln não é uma Promise para ser aguardada. O await espera a resolução de uma Promise, e aqui está sendo usado em uma função que retorna undefined.

Alternativa E — ✅ Correta ⟵ GABARITO

fatorial(5).then(x => document.writeln(...)) é a forma correta: quando a Promise retornada por fatorial(5) for resolvida, a função callback recebe o valor x (o fatorial) e o escreve no documento.

NÃO CAIA NESSA!

Muitos candidatos podem achar que await funciona em qualquer lugar, quando na verdade ele só é permitido dentro de funções async ou no top-level de módulos. A banca explora essa confusão na alternativa B. Além disso, a alternativa A é uma tentativa óbvia de imprimir a Promise como string, mas o candidato desatento pode não perceber que async retorna Promise.

Gabarito: letra E.

Link permanente: /questoes/fg071518