Fácil JavaScript
Criando e consumindo uma Promise
Enunciado
Escreva uma função esperar(ms) que retorna uma Promise que resolve após ms milissegundos com a mensagem 'Concluído após X ms'. Use .then() para exibir a mensagem no console.
Requisitos
- A função
esperardeve retornar uma Promise. - A Promise deve resolver após o tempo especificado.
- O valor resolvido deve ser a string
'Concluído após X ms', onde X é o valor dems. - Use
.then()para imprimir o resultado no console.
Código inicial
function esperar(ms) {
// Seu código aqui
}
esperar(1000).then(mensagem => {
// Exiba a mensagem
});
Saída esperada
Concluído após 1000 ms
Ver dica
Use setTimeout dentro do construtor da Promise e chame resolve com a string formatada.
Mostrar solução
function esperar(ms) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(`Concluído após ${ms} ms`);
}, ms);
});
}
esperar(1000).then(mensagem => {
console.log(mensagem);
});
Passo a passo
- A função
esperarrecebe um parâmetromsque representa o tempo em milissegundos. - Retornamos uma nova
Promiseque recebe a funçãoresolvecomo argumento. - Dentro da Promise, usamos
setTimeoutpara agendar a execução apósmsmilissegundos. - Quando o tempo passa, chamamos
resolvecom a string formatada usando template literals. - Fora da função, chamamos
esperar(1000)e encadeamos um.then()para receber a mensagem. - No callback do
.then(), imprimimos a mensagem no console.
Por que funciona
A Promise encapsula uma operação assíncrona (o setTimeout). Quando o tempo termina, chamamos resolve, o que muda o estado da Promise de pending para fulfilled. O .then() registra um callback que será executado assim que a Promise for resolvida, recebendo o valor passado para resolve.
Erros comuns
- Esquecer de retornar a Promise: se você não usar
return new Promise(...), a função retornaundefinede o.then()falha comTypeError: Cannot read property 'then' of undefined. - Chamar
resolvefora dosetTimeout: isso faria a Promise resolver imediatamente, sem esperar o tempo. - Não usar template literals corretamente: por exemplo,
'Concluído após ' + ms + ' ms'também funciona, mas se esquecer as crases ou a interpolação, a saída fica errada.
Outra forma de resolver
Usar async/await com uma função assíncrona:
async function main() {
const mensagem = await esperar(1000);
console.log(mensagem);
}
main();
Essa forma é preferível quando você quer um código mais linear e legível, mas o enunciado pede .then().
Saída esperada
Concluído após 1000 ms