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 esperar deve 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 de ms.
  • 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

  1. A função esperar recebe um parâmetro ms que representa o tempo em milissegundos.
  2. Retornamos uma nova Promise que recebe a função resolve como argumento.
  3. Dentro da Promise, usamos setTimeout para agendar a execução após ms milissegundos.
  4. Quando o tempo passa, chamamos resolve com a string formatada usando template literals.
  5. Fora da função, chamamos esperar(1000) e encadeamos um .then() para receber a mensagem.
  6. 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 retorna undefined e o .then() falha com TypeError: Cannot read property 'then' of undefined.
  • Chamar resolve fora do setTimeout: 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