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.
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");
}
}