web-dev-qa-db-fra.com

Création d'une chaîne de promesses dans une boucle for

Je m'attendrais à ce que le code ci-dessous imprime un numéro sur la console, puis attendait une seconde, puis imprimait un autre numéro. Au lieu de cela, il imprime les 10 numéros immédiatement et attend ensuite dix secondes. Quelle est la bonne façon de créer une chaîne de promesses qui se comporte comme décrit?

function getProm(v) {
    return new Promise(resolve => {
        console.log(v);
        resolve();
    })
}

function Wait() {
    return new Promise(r => setTimeout(r, 1000))
}

function createChain() {
    let a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
    let chain = Promise.resolve();
    for (let i of a) {
        chain.then(()=>getProm(i))
            .then(Wait)

    }
    return chain;
}


createChain();
20
TLP

Vous devez affecter la valeur de retour de .then retour à chain:

chain = chain.then(()=>getProm(i))
         .then(Wait)

Maintenant, vous allez essentiellement faire

chain
  .then(()=>getProm(1))
  .then(Wait)
  .then(()=>getProm(2))
  .then(Wait)
  .then(()=>getProm(3))
  .then(Wait)
  // ...

au lieu de

chain
  .then(()=>getProm(1))
  .then(Wait)

chain
  .then(()=>getProm(2))
  .then(Wait)

chain
  .then(()=>getProm(3))
  .then(Wait)
// ...

Vous pouvez voir que le premier est en fait une chaîne, tandis que le second est parallèle.

25
Felix Kling