Da trilha de JavaScript Este conceito ainda não saiu como card do dia. ir para o card de hoje

JavaScript Assincronia Intermediário

Promises

Uma Promise é um objeto que representa a conclusão (ou falha) de uma operação assíncrona. Ela tem três estados possíveis: pending (pendente), fulfilled (resolvida) e rejected (rejeitada). Uma vez que a promise é resolvida ou rejeitada, seu estado não muda mais.

Para consumir o resultado de uma promise, usamos os métodos .then() e .catch(). O .then() recebe uma função de callback que é executada quando a promise é resolvida, enquanto o .catch() trata erros (promise rejeitada). Esses métodos retornam uma nova promise, permitindo o encadeamento de operações assíncronas de forma sequencial.

Quando precisamos executar várias promises em paralelo, usamos Promise.all() ou Promise.allSettled(). O Promise.all() aguarda que todas sejam resolvidas e retorna um array com os resultados; se qualquer uma for rejeitada, ele rejeita imediatamente. Já o Promise.allSettled() aguarda que todas terminem (resolvidas ou rejeitadas) e retorna um array de objetos descrevendo o resultado de cada uma.

Pontos-chave

  • Uma promise pode estar pendente, resolvida ou rejeitada; uma vez resolvida/rejeitada, não muda mais.
  • .then() e .catch() registram callbacks para lidar com o resultado ou erro.
  • O encadeamento de .then() permite executar operações assíncronas em sequência.
  • Promise.all() falha rápido se qualquer promise for rejeitada; Promise.allSettled() sempre espera todas terminarem.
  • Use Promise.allSettled() quando você quer todos os resultados, mesmo que alguns falhem.
promises.js
// Exemplo de uso de Promises em JavaScript

// Função que simula uma requisição assíncrona
function buscarDados(id) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (id > 0) {
        resolve({ id, nome: `Item ${id}` });
      } else {
        reject(new Error('ID inválido'));
      }
    }, 1000);
  });
}

// Encadeamento e tratamento de erro
buscarDados(1)
  .then(dados => {
    console.log('Dados recebidos:', dados);
    return buscarDados(2); // encadeia outra promise
  })
  .then(dados2 => {
    console.log('Segundo dado:', dados2);
  })
  .catch(erro => {
    console.error('Erro:', erro.message);
  });

// Promise.all: executa várias em paralelo e falha se qualquer uma falhar
Promise.all([buscarDados(3), buscarDados(4)])
  .then(resultados => {
    console.log('Promise.all resultados:', resultados);
  })
  .catch(erro => {
    console.error('Promise.all erro:', erro.message);
  });

// Promise.allSettled: aguarda todas, independente de sucesso ou falha
Promise.allSettled([buscarDados(5), buscarDados(-1)])
  .then(resultados => {
    console.log('Promise.allSettled:', resultados);
  });

Exercícios

  1. 1
    Fácil

    Criando e consumindo uma Promise

    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.

    Resolver
  2. 2
    Médio

    Encadeamento com tratamento de erro

    Crie uma função dividir(a, b) que retorna uma Promise. Se b for zero, rejeite com new Error('Divisão por zero'). Caso contrário, resolva com o resultado da divisão. Use encadeamento de .then() para calcular (10 / 2) / 5 e depois .catch() para tratar erros. Exiba o resultado final ou a mensagem de erro.

    Resolver
  3. 3
    Desafio

    Promise.all vs Promise.allSettled

    Crie uma função buscarUsuario(id) que retorna uma Promise que resolve após 500ms com um objeto { id, nome: 'Usuário ' + id } se id > 0, ou rejeita com new Error('ID inválido') se id <= 0. Use Promise.all() para buscar os IDs [1, 2, 3] e exiba os resultados. Depois, use Promise.allSettled() para buscar os IDs [4, -1, 5] e exiba o status e o valor/erro de cada um.

    Resolver

Continue estudando