DEV Community

Weverton Rodrigues
Weverton Rodrigues

Posted on • Updated on

Encadeando Promises em Javascript

Sabe quando você precisa encadear várias promises e a chamada seguinte depende do resultado da chamada anterior? Isso é comum em muitos cenários de desenvolvimento, especialmente ao lidar com operações assíncronas, como cadastro de usuários em um sistema. Vamos explorar como podemos fazer isso de forma eficiente e organizada em JavaScript.

Para resolver esse problema, podemos usar o conceito de promises recursivas (ou encadeadas) em JavaScript. Vamos ver como podemos fazer isso em um exemplo prático:

async function postUsuario(usuario) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      // Suponha que a chamada seja bem-sucedida aqui
      console.log(`Usuário ${usuario.nome} cadastrado com sucesso.`);
      resolve();
    }, 1000);
  });
}

async function sequentialPost(usuarios, index) {
  if (index >= usuarios.length) {
    return; // Encerra a recursão quando todos os usuários foram cadastrados
  }

  try {
    await postUsuario(usuarios[index]);
    await sequentialPost(usuarios, index + 1); // Chamada recursiva para o próximo usuário
  } catch (error) {
    console.error(`Erro ao cadastrar usuário ${usuarios[index].nome}:`, error);
    // Lidar com o erro, se necessário
  }
}

async function cadastrarUsuarios(usuarios) {
  await sequentialPost(usuarios, 0); // Inicia a recursão a partir do índice zero
}

const usuarios = [
  { nome: "João", email: "joao@example.com" },
  { nome: "Maria", email: "maria@example.com" },
  { nome: "Pedro", email: "pedro@example.com" }
];

cadastrarUsuarios(usuarios);
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, além da função postUsuario, adicionamos a função sequentialPost, que realiza o encadeamento das chamadas de cadastro dos usuários de forma recursiva. A função cadastrarUsuarios inicia o processo chamando sequentialPost com o array de usuários e o índice inicial zero.

Espero que tenha curtido!

Top comments (1)

Collapse
 
gomesbreno profile image
Breno Gomes

É possível utilizar a função nativa do JS Promisse.all(), que retorna uma única Promise que resolve quando todas as promises no argumento iterável forem resolvidas ou quando o iterável passado como argumento não contém promises. É rejeitado com o motivo da primeira promise que foi rejeitada

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});

Promise.all([promise1, promise2, promise3]).
then(([response1,response2,response3]) => {
console.log('MIAAAAAAAAU');
});