Creating a promise chain in a for loop

后端 未结 2 925
醉话见心
醉话见心 2020-12-08 10:46

I would expect the code below to print one number on the console, then wait a second and then print another number. Instead, it prints all 10 numbers immediately and then wa

相关标签:
2条回答
  • 2020-12-08 10:55

    You have to assign the return value of .then back to chain:

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

    Now you will basically be doing

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

    instead of

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

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

    0 讨论(0)
  • 2020-12-08 11:05

    Now that we have await/async, a better way to do this is:

    function getProm(v) {
        return new Promise(resolve => {
            console.log(v);
            resolve();
        })
    }
    
    function Wait() {
        return new Promise(r => setTimeout(r, 1000))
    }
    
    async function createChain() {
        let a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
        for (let i of a) {
            await getProm(i);
            await Wait();
        }
    }
    
    
    createChain();
    
    0 讨论(0)
提交回复
热议问题