Search code examples
javascriptasynchronousecmascript-6promisees6-promise

JavaScript/TypeScript - loop of promises doesn't wait


I have a loop of 100 promises. I want to process 10 of those simultaneously, then print a statement, and continue with the next 10 in parallel. However, it does not wait for every 10 promises to finish their execution.

const promises = [];
for (let i = 1; i <= 100; i ++) {

   const blockPromise = this.web3.eth.getBlock(i).then((block: any) => {
        winston.info("Processing block " + i);
   }).catch((err: Error) => {
        winston.error(err);
   });

   promises.push(blockPromise);

   if (i % 10 === 0) {
       Promise.all(promises).then(() => {
            winston.info("+++ Processed " + 10 + " blocks");
       }).catch((err: Error) => {
            winston.error(err);
       });
   }

My expectation is something like:

Processing block 1
Processing block 3
Processing block 7
Processing block 2
Processing block 4
Processing block 5
Processing block 6
Processing block 9
Processing block 10
Processing block 8
+++ Processed 10 blocks
Processing block 12
...

However, it is chaotically mixed up. What am I doing wrong? Any help appreciated.


Solution

  • Since you are trying to process 10 promises each time, you could await after each batch of 10 or would that defeat the purpose?

    var promises = []; // You are mutating it so better not be a const
    var blockPromise = null;
    for (let i = 1; i <= 100; i ++) {
    
     blockPromise = this.web3.eth.getBlock(i).then((block: any) => {
          winston.info("Processing block " + i);
     }).catch((err: Error) => {
          winston.error(err);
     });
    
     promises.push(blockPromise);
    
     if (i % 10 === 0) {
         await Promise.all(promises);
         promises = [] // clear the processed promises as well
         winston.info("+++ Processed " + 10 + " blocks");
     }
    }