Aula 2

JavaScript Avançado

Promises

Definição de Promise

Uma Promise é um objeto que representa uma operação que pode:

O que é uma Promise?

É como uma “promessa da vida real”: algo que pode dar certo ou errado no futuro.

Exemplo 1

let promessa = new Promise((resolve, reject) => {
  let sucesso = true;
  if (sucesso) {
    resolve("🎉 Deu certo!");
  } else {
    reject("❌ Algo deu errado!");
  }
});

promessa.then(msg => console.log(msg));

Como criar uma Promise

Exemplo 2

function esperar(ms) {
  return new Promise(resolve => {
    setTimeout(() => resolve("⏳ Espera concluída"), ms);
  });
}

esperar(2000).then(msg => console.log(msg));

Usando then e catch

Exemplo 3

let promessa2 = new Promise((resolve, reject) => {
  let numero = Math.random();
  if (numero > 0.5) resolve("Número aceito: " + numero);
  else reject("Número muito baixo: " + numero);
});

promessa2
  .then(msg => console.log("✅", msg))
  .catch(erro => console.log("⚠️", erro));

Resolve e Reject

Dentro de uma Promise, usamos duas funções:

Exemplo 1

let promessa = new Promise((resolve, reject) => {
  let sucesso = true;
  if (sucesso) resolve("✅ Deu certo!");
  else reject("❌ Algo deu errado!");
});

promessa.then(console.log).catch(console.error);
Exemplo 2

function verificarNumero(n) {
  return new Promise((resolve, reject) => {
    if (n > 10) resolve("Maior que 10");
    else reject("Menor ou igual a 10");
  });
}

verificarNumero(15).then(console.log).catch(console.error);
Exemplo 3

function dividir(a, b) {
  return new Promise((resolve, reject) => {
    if (b === 0) reject("❌ Divisão por zero!");
    else resolve(a / b);
  });
}

dividir(10, 2).then(console.log).catch(console.error);

Finally

O finally() é sempre executado, independente se a Promise foi resolvida ou rejeitada. É útil para liberar recursos, fechar conexões ou exibir mensagens finais.

Exemplo 1

new Promise((resolve, reject) => {
  resolve("✅ Sucesso!");
})
.then(console.log)
.catch(console.error)
.finally(() => console.log("Finalizado!"));
Exemplo 2

new Promise((resolve, reject) => {
  reject("❌ Ocorreu um erro");
})
.then(console.log)
.catch(console.error)
.finally(() => console.log("Liberando recursos..."));
Exemplo 3

function simularRequisicao() {
  return new Promise((resolve, reject) => {
    setTimeout(() => reject("Servidor indisponível"), 1500);
  });
}

simularRequisicao()
  .then(console.log)
  .catch(console.error)
  .finally(() => console.log("⏳ Tentativa concluída"));

Promise.all()

O Promise.all() executa várias Promises em paralelo e só resolve quando todas são concluídas com sucesso. Se alguma falhar, ele rejeita tudo.

Exemplo 1

Promise.all([
  Promise.resolve("🍎 Maçã"),
  Promise.resolve("🍌 Banana"),
  Promise.resolve("🍇 Uva")
]).then(console.log);
Exemplo 2 (com falha)

Promise.all([
  Promise.resolve("✅ Ok 1"),
  Promise.reject("❌ Falhou!"),
  Promise.resolve("✅ Ok 2")
])
.then(console.log)
.catch(console.error);
Exemplo 3 (simulação de requisições)

function esperar(ms, msg) {
  return new Promise(resolve => setTimeout(() => resolve(msg), ms));
}

Promise.all([
  esperar(1000, "📦 Produto"),
  esperar(2000, "🚚 Entrega"),
  esperar(1500, "💳 Pagamento")
]).then(console.log);

Promise.allSettled()

Diferente do all(), o allSettled() espera todas as Promises terminarem, seja com sucesso ou erro, e retorna o status de cada uma.

Exemplo 1

Promise.allSettled([
  Promise.resolve("✅ Sucesso"),
  Promise.reject("❌ Erro"),
])
.then(console.log);

Promise.race()

O Promise.race() retorna a primeira Promise que finalizar (sucesso ou erro).

Exemplo 1

Promise.race([
  new Promise(res => setTimeout(() => res("⏰ 1s"), 1000)),
  new Promise(res => setTimeout(() => res("⏰ 2s"), 2000)),
])
.then(console.log);

Promise.any()

O Promise.any() retorna a primeira Promise que for resolvida com sucesso. Se todas falharem, gera um erro.

Exemplo 1

Promise.any([
  Promise.reject("❌ Erro 1"),
  Promise.reject("❌ Erro 2"),
  Promise.resolve("✅ Sucesso na terceira!")
])
.then(console.log)
.catch(console.error);