← Questões de Programação

Programação · FGV · 2023

Questão comentada de Programação

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:

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.

Continue treinando

Questões relacionadas