Search code examples
javascriptloopsasync-awaitpromisepuppeteer

For loop run puppeteer function out of order


I have a loop which contains an puppeteer function. The problem is that the loop is doing all puppeteer at the same time.

I've tried this:

import puppeteer from "puppeteer"

(async function(){
    for(let i = 0; i < 3; i++){
        await launchPup().then(() => {
        });
    }
})()

async function launchPup() {
    puppeteer.launch({headless: false}).then(async browser => {
        await browser.newPage()
        await browser.close()
    })
}

Could you tell me what I'm doing wrong and how can fix this?


Solution

  • It's an async function, you have to keep a look out at the created browser.

    Something like this should help:

    var totalOpenedbrowser = 0;
    var minBrowser = 2;
    const wait = () => new Promise((resolve) => setTimeout(resolve, 200))
    
    (async function() {
      for (let i = 0; i < 3; i++) {
    
        await launchPup().then(() => {});
      }
    })()
    
    
    
    async function launchPup() {
      while (totalOpenedbrowser > = minBrowser)
        await wait(); // wait until there is a free slott
      totalOpenedbrowser++;
      puppeteer.launch({
        headless: false
      }).then(async browser => {
        await browser.newPage()
        await browser.close()
        totalOpenedbrowser--;
      })
    }

    Have a look at the library I build, it will solve your issue: https://www.npmjs.com/package/puppeteer-express