Encadeando then() em Promises no JavaScript

Entenda como usar o método then() em Promises para encadear várias operações assíncronas e criar fluxos de execução mais legíveis.

Como encadear then() em Promises?

Em JavaScript, as Promises são usadas para lidar com operações assíncronas de uma maneira mais legível e estruturada. Quando você usa uma Promise, pode encadear múltiplas operações assíncronas utilizando o método then(). Esse método permite que você defina o que deve acontecer após a Promise ser resolvida, e pode ser encadeado para realizar várias ações em sequência, sem precisar de aninhamento de callbacks.

O método then()

O método then() é usado para registrar uma função de callback que será executada quando a Promise for resolvida. Ele recebe dois parâmetros: o primeiro é uma função que será chamada quando a Promise for cumprida (resolvida com sucesso) e o segundo é uma função que será chamada em caso de erro.

Exemplo de código básico com then():

let minhaPromise = new Promise(function(resolve, reject) {
  let sucesso = true;
  if (sucesso) {
    resolve('A operação foi bem-sucedida!');
  } else {
    reject('A operação falhou!');
  }
});

minhaPromise.then(function(result) {
  console.log(result);  // 'A operação foi bem-sucedida!'
}).catch(function(error) {
  console.log(error);  // 'A operação falhou!'
});

Neste exemplo, a Promise é resolvida com sucesso e o método then() imprime a mensagem no console. Se a Promise fosse rejeitada, a função dentro do catch() seria chamada.

Encadeando várias Promises com then()

O verdadeiro poder de then() se revela quando você começa a encadear várias Promises, criando um fluxo assíncrono de tarefas. Isso permite que você execute uma operação depois de outra, de maneira limpa e legível.

Exemplo de encadeamento de then():

let promise1 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 1000, 'Primeira operação concluída');
});
let promise2 = new Promise(function(resolve, reject) {
  setTimeout(resolve, 2000, 'Segunda operação concluída');
});

promise1.then(function(result1) {
  console.log(result1);  // 'Primeira operação concluída'
  return promise2;
}).then(function(result2) {
  console.log(result2);  // 'Segunda operação concluída'
});

Neste exemplo, a primeira Promise (promise1) é resolvida e, dentro de seu then(), retornamos a segunda Promise (promise2). O segundo then() espera a resolução de promise2 antes de imprimir a mensagem. Esse encadeamento de Promises cria uma sequência de operações assíncronas.

Explicação do código acima

  • O primeiro then() é executado quando promise1 é resolvida. Ele imprime o resultado e retorna a segunda Promise, promise2.
  • O segundo then() é executado quando promise2 é resolvida e imprime a segunda mensagem.

Usando then() para passar dados entre funções assíncronas

Além de encadear Promises, você também pode usar o then() para passar dados de uma função assíncrona para a próxima. Isso é muito útil quando você precisa executar uma série de operações assíncronas que dependem umas das outras.

Exemplo de como passar dados entre then():

let promise1 = new Promise(function(resolve, reject) {
  resolve(10);
});

promise1.then(function(result) {
  console.log('Primeiro valor:', result);  // 10
  return result * 2;
}).then(function(result2) {
  console.log('Segundo valor:', result2);  // 20
});

Aqui, o primeiro valor (10) é passado do primeiro then() para o segundo, onde ele é multiplicado por 2 antes de ser impresso.

Considerações sobre o encadeamento de then()

Ao encadear várias Promises, você pode criar fluxos de execução assíncrona limpos e controlados. No entanto, é importante garantir que você esteja lidando com erros de maneira eficiente. Se uma Promise for rejeitada em qualquer ponto do encadeamento, o erro será capturado no primeiro catch() disponível.

Conclusão

O encadeamento de then() em Promises é uma técnica fundamental para lidar com múltiplas operações assíncronas em sequência. Com isso, você pode criar fluxos de trabalho assíncronos mais legíveis e menos propensos a erros. Lembre-se de sempre usar catch() para capturar e tratar erros e garantir que seu código assíncrono seja robusto e fácil de manter.

Encadear Promises utilizando o método then() é uma das melhores formas de escrever código assíncrono limpo e eficiente. Ao usar esse método, você consegue organizar melhor suas operações assíncronas, evitando o caos de múltiplos callbacks aninhados. Para operações que exigem sequência e dependem de uma após a outra, o encadeamento de then() oferece uma solução elegante e fácil de entender.

Algumas aplicações:

  • Encadear requisições assíncronas em sequência.
  • Passar dados de uma função assíncrona para outra em uma cadeia de Promises.
  • Facilitar o controle de fluxo em operações assíncronas, evitando aninhamentos complexos de callbacks.
  • Combinar várias Promises que precisam ser resolvidas em ordem específica.

Dicas para quem está começando

  • Comece com Promises simples e use then() para encadear várias operações de forma sequencial.
  • Evite criar muitos then() encadeados sem tratamento de erro, pois isso pode tornar o código difícil de depurar.
  • Use o método catch() para capturar e tratar erros, garantindo que seu código seja robusto.
  • Experimente com dados simples e comece a aplicar then() em funções assíncronas mais complexas conforme for se acostumando.

Contribuições de João Gutierrez

Compartilhe este tutorial: Como encadear then() em Promises?

Compartilhe este tutorial

Continue aprendendo:

O que é Promise em JavaScript?

Entenda o conceito de Promises em JavaScript e como usá-las para resolver problemas com código assíncrono de maneira mais eficiente e legível.

Tutorial anterior

O que é async/await e como funciona?

Descubra como usar async/await em JavaScript, uma maneira moderna e mais legível de lidar com operações assíncronas.

Próximo tutorial