Questão nº 76
Questão de Tecnologia da Informação · FGV TCE-SP 2023 (nº 76)
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:
- Adocument.writeln('Fat 5: '+fatorial(5));
- Bdocument.writeln(
Fat 5: ${await fatorial(5)}); - Cx = fatorial(5) => document.writeln(
Fat 5: ${x}); - Dawait document.writeln(
Fat 5: ${fatorial(5)}); - Efatorial(5).then(x=>document.writeln(
Fat 5: ${x})). (alternativa correta)
Resposta comentada
Gabarito Alternativa E
Funções assíncronas em JavaScript, marcadas com async, sempre retornam um objeto Promise, que é uma promessa de que um valor estará disponível no futuro. Para acessar o valor real (o resultado da operação), precisamos "esperar" que essa Promise seja resolvida, o que pode ser feito com .then() ou await. O problema original ocorre porque fatorial(5) retorna uma Promise, e ao tentar imprimi-la diretamente, o JavaScript converte o objeto Promise para sua representação em string, que é [object Promise].
- (A) Incorreta: A concatenação de strings com
+trata o objeto Promise da mesma forma que o template literal, resultando na impressão de[object Promise]. - (B) Incorreta: O operador
awaitsó pode ser utilizado dentro de uma funçãoasync. Como a chamada adocument.writelnnão está dentro de uma funçãoasync, isso geraria um erro de sintaxe. - (C) Incorreta: A sintaxe
x = fatorial(5) => ...está incorreta. Mesmo que fosselet x = fatorial(5); document.writeln(...), a variávelxainda conteria o objeto Promise, não seu valor resolvido. - (D) Incorreta: Similar à alternativa B,
awaitnão pode ser usado diretamente no escopo global ou fora de uma funçãoasync. Além disso,document.writelnnão é uma função assíncrona para ser "awaitada". - (E) Correta: O método
.then()é a forma padrão de lidar com o resultado de uma Promise. Ele registra uma função de callback que será executada apenas quando a Promise for resolvida (ou seja, quando o cálculo do fatorial for concluído), recebendo o valor final (x) como argumento. Assim,document.writelnimprime o valor correto.
Fonte: FGV TCE-SP 2023 Auxiliar Técnico da Fiscalização - TI (Caderno Tipo 1). Reproduzida para fins de estudo.