Questão de Programação — Linguagens de programação — FGV 2023
Programação›Linguagens 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:
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 awaitdentro 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.
1Função async retorna Promise
2Chamar sem await → [object Promise]
3Solução: .then() ou await
4.then() funciona em script comum
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.