Encadeamento de promises contidas em um array

1. Encadeamento de promises contidas em um array

Jefferson Ferreira da Silva
jeffersontdb

(usa CentOS)

Enviado em 21/09/2020 - 16:24h

Boa tarde, pessoal.
Sou iniciante no Javascript e estou quebrando a cabeça com uma situação envolvendo Promises. Já pesquisei bastante, mas não encontrei nada que resolva a questão. Tenho um array contendo promises, onde cada promise precisa esperar a anterior finalizar. Ou seja, a promise na posição 1 do array só deverá executar quando a promise da posição 0 for resolvida (ou rejeitada). Preciso que seja desta forma porque a tarefa que cada promise executa não pode concorrer com as outras e a quantidade de promises no array pode variar (por isso, o array). O código abaixo executa todas as promises em paralelo. Eu preciso que seja encadeado. Sei que posso encadear o .then pra obter esse resultado, só não sei como fazer isso percorrendo um array.


// orderVerifiedAddresses é um array de objetos JSON recebidos de outra função.
let orderVerifiedClients = [];
Promise.all(orderVerifiedAddresses.map((order) => {
return new Promise((resolve, reject) => {
return validateOrder(order);
}).then(order => {
console.log('Cliente validado com sucesso. Vamos prosseguir.');
}).catch(error => {
console.log(error);
});
})).then(() => {
res.send(orderVerifiedClients);
});



  


2. Re: Encadeamento de promises contidas em um array

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 21/09/2020 - 21:04h


jeffersontdb escreveu:

Boa tarde, pessoal.
Sou iniciante no Javascript e estou quebrando a cabeça com uma situação envolvendo Promises. Já pesquisei bastante, mas não encontrei nada que resolva a questão. Tenho um array contendo promises, onde cada promise precisa esperar a anterior finalizar. Ou seja, a promise na posição 1 do array só deverá executar quando a promise da posição 0 for resolvida (ou rejeitada). Preciso que seja desta forma porque a tarefa que cada promise executa não pode concorrer com as outras e a quantidade de promises no array pode variar (por isso, o array). O código abaixo executa todas as promises em paralelo. Eu preciso que seja encadeado. Sei que posso encadear o .then pra obter esse resultado, só não sei como fazer isso percorrendo um array.


// orderVerifiedAddresses é um array de objetos JSON recebidos de outra função.
let orderVerifiedClients = [];
Promise.all(orderVerifiedAddresses.map((order) => {
return new Promise((resolve, reject) => {
return validateOrder(order);
}).then(order => {
console.log('Cliente validado com sucesso. Vamos prosseguir.');
}).catch(error => {
console.log(error);
});
})).then(() => {
res.send(orderVerifiedClients);
});

Boa noite Jefferson,
Utilizo a seguinte função, para "temporizar", um "laço".
(function wait(n) {
if (n<5) setTimeout(() => {wait(n);}, (250));
console.log("N "+n+" UTS => "+new Date().getTime());
n++;
} (0));

Nota: apesar do condicional:
(n<5) ele conta até 5.....

______________________________________________________________________
Importante: echo -e "\n$(lynx --dump goo.gl/a9KeFc|sed -nr '/^[ ]+Se/,/dou.$/p')\n"
Att.: Marcelo Oliver
______________________________________________________________________


3. Re: Encadeamento de promises contidas em um array

Jefferson Ferreira da Silva
jeffersontdb

(usa CentOS)

Enviado em 04/10/2020 - 16:22h

Obrigado pela resposta Marcelo. Desculpe a demora para interagir de volta.

Eu precisava avançar com o projeto e a forma que consegui fazer foi a seguinte:


console.log('Iniciando processamento de pedidos.');
let counter = 0;
let limit = orders.length;
let cmd1 = "let process = new Promise((resolve, reject) => {";
let cmd2 = "";
for (counter; counter < limit; counter++) {
cmd1 += "" +
"let validatedOrder" + orders[counter].CAB.IDPEDIDO + " = validateOrder(orders[" + counter + "]);\r\n" +
"validatedOrder" + orders[counter].CAB.IDPEDIDO + ".then(result => {\r\n" +
"console.log('Processado pedido: ', result.CAB.IDPEDIDO, ' da loja ', result.CAB.LOJA);\r\n" +
"ordersVerified.push(result);\r\n";
cmd2 = "}).catch(error => { console.log(error); });\r\n" + cmd2;
}

let cmd = cmd1 + "resolve();" + cmd2 +
"});\r\nprocess.then(order => {" +
"console.log('TUDO CERTO ATÉ AQUI');" +
"res.send(ordersVerified);" +
"}).catch(error => {" +
"console.log(error);" +
"});";
eval(cmd);


O retorno disso é uma string com várias promises encadeadas, de acordo com a quantidade de pedidos no array.

Acredito que não seja a forma mais adequada ou mesmo eficiente de se fazer, pois se o array for muito grande posso deixar o servidor lento, mas funcionou. Por enquanto, está assim. Até que eu consiga encontrar outra solução.

Desculpe, mas eu não consegui aplicar a sua ideia nesse cenário.








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts