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