Saltar para o conteúdo principal
Publicado em

Promises em JavaScript

Partilhar:

Introdução

Promises são um aspecto fundamental da programação assíncrona em JavaScript, oferecendo uma forma mais gerível e legível de lidar com operações que demoram a ser concluídas. Neste artigo, vamos abordar o que são Promises, como utilizá-las e dicas para tirar o máximo partido delas.

O que são Promises?

Uma Promise em JavaScript é um objeto que representa a eventual conclusão ou falha de uma operação assíncrona. Permite escrever código assíncrono de uma forma que é quase tão fácil de compreender e manter quanto o código síncrono.

Características das Promises

  • Estado: Uma Promise tem três estados: pendente (pending), resolvida (fulfilled) ou rejeitada (rejected).
  • Imutabilidade: Uma vez que uma Promise é resolvida ou rejeitada, o seu estado não pode mais ser alterado.

Criando e Usando Promises

Pode criar uma Promise utilizando o construtor Promise e os métodos resolve e reject.

Exemplo de Criação de Promise

let promessa = new Promise((resolve, reject) => {
  let sucesso = true; // Simula uma operação

  if (sucesso) {
    resolve('Operação bem-sucedida');
  } else {
    reject('Falha na operação');
  }
});

Consumindo Promises

Para consumir o valor de uma Promise resolvida ou tratar erros, utiliza-se os métodos then e catch.

promessa
  .then((valor) => {
    console.log(valor); // 'Operação bem-sucedida'
  })
  .catch((erro) => {
    console.error(erro);
  });

Encadeamento de Promises

Uma das maiores vantagens das Promises é a capacidade de as encadear, o que simplifica o tratamento de várias operações assíncronas sequenciais.

Exemplo de Encadeamento

function primeiraOperacao() {
  return new Promise((resolve) => {
    resolve('Resultado da primeira operação');
  });
}

function segundaOperacao(resultadoAnterior) {
  return new Promise((resolve) => {
    resolve(`Resultado da segunda operação após: ${resultadoAnterior}`);
  });
}

primeiraOperacao()
  .then((resultado) => segundaOperacao(resultado))
  .then((resultadoFinal) => console.log(resultadoFinal));

Promises e Tratamento de Erros

As Promises também simplificam o tratamento de erros em operações assíncronas, permitindo capturar erros em qualquer ponto da cadeia de Promises.

Uso do Catch para Erros

promessa
  .then((valor) => {
    // Processamento do valor
  })
  .catch((erro) => {
    console.error('Erro capturado:', erro);
  });

Promises e Operações Paralelas

Além de operações sequenciais, as Promises são úteis para gerir múltiplas operações assíncronas que podem ser executadas em paralelo.

Promise.all para Execução Paralela

Promise.all é utilizado para aguardar a conclusão de várias Promises.

Promise.all([primeiraOperacao(), segundaOperacao('valor inicial')])
  .then((resultados) => {
    console.log('Todos os resultados:', resultados);
  })
  .catch((erro) => {
    console.error('Erro numa das operações:', erro);
  });

Boas Práticas e Dicas

  1. Evite o Aninhamento Excessivo: Utilize o encadeamento de Promises em vez de aninhar callbacks para evitar a complexidade.
  2. Tratamento de Erros: Certifique-se de tratar sempre os erros em Promises, especialmente em cadeias de Promises.
  3. Uso de Async/Await: Para uma sintaxe ainda mais limpa, considere utilizar async/await, que permite escrever código assíncrono de forma síncrona.

Conclusão

As Promises revolucionaram a forma como o código assíncrono é escrito em JavaScript, oferecendo uma abordagem mais clara e gerível para operações que demoram a ser concluídas. Dominar a utilização de Promises é essencial para qualquer programador que trabalhe com JavaScript, especialmente em aplicações web modernas.

Happy coding!