Creating a promise chain in a for loop

I expect the code below to print one number on the console, and then wait a second and then print another number. Instead, it prints all 10 numbers at once, and then waits ten seconds. What is the correct way to create a promise chain that behaves as described?

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(); 
+7
javascript es6-promise
source share
1 answer

You need to return the .then return value to chain :

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

Now you will mainly do

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

instead

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

You can see that the first is actually a chain, and the second is parallel.

+13
source share

All Articles