我试图遍历唯一的youtube视频链接以获取屏幕截图。

调试之后,我注意到下面的forloop,JS产生了2个进程线程,每个索引i都有1个。第二个线程中的processALink()函数似乎在第一个线程中的processALink()完全结束之前启动。

为什么会这样呢?我以为使用异步/等待可以阻止这种情况的发生。

forloop在异步函数内部。下面的代码只是原始源代码的摘录。

 for(let i = 0; i<2; i++){
    var link = linksArr[i];
    var label = labelsArr[i];
    await proccessALink(link, label)
  }


processALink()的函数def

var proccessALink = async (link,label)=>{
    //set download path
    var downloadPath  = 'data/train/'+label;
    //parse the url
    var urlToScreenshot = parseUrl(link)
    //Give a URL it will take a screen shot
    if (validUrl.isWebUri(urlToScreenshot)) {
      // console.log('Screenshotting: ' + urlToScreenshot + '&t=' + req.query.t)
      console.log('Screenshotting: ' + link)
      ;(async () => {

        //Logic to login to youtube below
        //await login();
        //go to the url and wait till all the content is loaded.
        await page.goto(link, {
          waitUntil: 'networkidle'
          //waitUntil: 'domcontentloaded'
        })
        //await page.waitForNavigation();

        //Find the video player in the page
        const video = await page.$('.html5-video-player')
        await page.content();

        //Run some command on consoleDev
        await page.evaluate(() => {
          // Hide youtube player controls.
          let dom = document.querySelector('.ytp-chrome-bottom')
          if(dom != null){
            dom.style.display = 'none'
          }
        })

        await video.screenshot({path: downloadPath});

      })()
    } else {
      res.send('Invalid url: ' + urlToScreenshot)
    }

  }

最佳答案

删除processALink()内的IIFE,它将解决同时运行多个屏幕截图的问题。

const proccessALink = async(link, label) => {
  //set download path
  const downloadPath = 'data/train/' + label;
  //parse the url
  const urlToScreenshot = parseUrl(link)
  //Give a URL it will take a screen shot
  if (validUrl.isWebUri(urlToScreenshot)) {
    // console.log('Screenshotting: ' + urlToScreenshot + '&t=' + req.query.t)
    console.log('Screenshotting: ' + link);
    //Logic to login to youtube below
    //await login();
    //go to the url and wait till all the content is loaded.
    await page.goto(link, {
      waitUntil: 'networkidle'
      //waitUntil: 'domcontentloaded'
    })
    //await page.waitForNavigation();

    //Find the video player in the page
    const video = await page.$('.html5-video-player')
    await page.content();

    //Run some command on consoleDev
    await page.evaluate(() => {
      // Hide youtube player controls.
      let dom = document.querySelector('.ytp-chrome-bottom')
      if (dom != null) {
        dom.style.display = 'none'
      }
    })

    await video.screenshot({
      path: downloadPath
    });
  } else {
    res.send('Invalid url: ' + urlToScreenshot)
  }

}

关于javascript - JS puppeteer使用for循环遍历链接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59704843/

10-10 04:13