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();
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.