DEV Community

Weverton Rodrigues
Weverton Rodrigues

Posted on • Edited 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!

Sentry blog image

Identify what makes your TTFB high so you can fix it

In the past few years in the web dev world, we’ve seen a significant push towards rendering our websites on the server. Doing so is better for SEO and performs better on low-powered devices, but one thing we had to sacrifice is TTFB.

Read more

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');
});

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit