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:
- A)document.writeln('Fat 5: '+fatorial(5));
Errada: a concatenação com uma função async continua exibindo a Promise, não o valor resolvido.
- B)document.writeln(`Fat 5: ${await fatorial(5)}`);
Errada: await só pode ser usado em contexto assíncrono, e aqui a escrita foi proposta sem envolver uma função async apropriada.
- C)x = fatorial(5) => document.writeln(`Fat 5: ${x}`);
Errada: a sintaxe está inválida e, além disso, não resolve o problema de extrair o valor da Promise.
- D)await document.writeln(`Fat 5: ${fatorial(5)}`);
Errada: await em document.writeln não faz sentido, porque writeln não retorna a Promise do fatorial e não resolve o resultado por si.
- E)fatorial(5).then(x=>document.writeln(`Fat 5: ${x}`)).
Certa: then recebe o valor resolvido da Promise e só então escreve o fatorial no documento.
Gabarito: E
Em JavaScript, uma função marcada com async sempre devolve uma Promise, mesmo que o corpo dela pareça calcular um valor simples. Por isso, ao fazer document.writeln(`Fat 5: ${fatorial(5)}`), o navegador não escreve o número 120, e sim a representação da Promise, aparecendo algo como [object Promise]. O ponto central aqui é que o resultado de uma função async não é obtido de forma imediata na interpolação da string. Para exibir o valor calculado, você precisa aguardar a resolução da Promise, normalmente com await dentro de um contexto assíncrono ou usando then(). A alternativa correta é a E porque ela trata o retorno como Promise e usa then(x => ...) para acessar o valor resolvido antes de escrever no documento. Isso é o comportamento padrão da linguagem, previsto na especificação do ECMAScript: async function retorna Promise e await/then servem para lidar com a resolução desse objeto. Em resumo: async não faz mágica de sincronismo, ela só deixa a função mais elegante para trabalhar com operações assíncronas. Se você colocar a chamada direto dentro de uma template string, o que entra ali é a Promise, não o valor final.