TransWikia.com

Como executar um por vez itens de um array em sequência utilizando Promise - Javascript

Stack Overflow em Português Asked on November 27, 2021

Possuo um array em que quero executar cada item, porém um só poderá iniciar após finalizar o anterior. O exemplo abaixo está imprimindo na sequência 2000,5000,10000 o que me faz entender que os três itens foram executados simultaneamente. Gostaria que cada item iniciasse apenas após a finalização do anterior. Esperava que fosse impresso 10000,5000,2000.

const durations = [10000, 5000, 2000]

const timeOut = (t) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(t)
            resolve(true)
        }, t)
    })
}

for (let index = 0; index < durations.length; index++) {
    const element = durations[index];
    timeOut(element);
}

One Answer

Você pode esperar o retorno de cada promise. Fiz da seguinte forma, utilizando o async e await, dessa forma o loop no array irá aguardar o retorno da sua promise para cada item.

const durations = [10000, 5000, 2000]

const timeOut = (t) => {
  return new Promise(resolve => setTimeout(resolve, t));
}

const init = async () => {
  for(i = 0; i < durations.length; i++) {
    const element = durations[i];
    await timeOut(element);
    console.log(element);
  }
}

init();

O problema do seu é que o for não está aguardando o retorno de suas promise, dessa forma ele irá executar todos os elementos de uma vez.

Outra forma simplificada de escrever seu código

const durations = [10000, 5000, 2000]

const timeOut = (t) => new Promise(resolve => setTimeout(resolve, t));

const init = async () => {
  for(const element of durations) {
    await timeOut(element);
    console.log(element);
  }
}

init();

Answered by Diego Vieira on November 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP