JS кукловод, использующий для l oop перебирать ссылки - PullRequest
2 голосов
/ 12 января 2020

Я пытаюсь перебрать уникальные ссылки на видео YouTube, чтобы получить скриншот.

После отладки я заметил для forl oop ниже: JS spawn 2 потока процесса, 1 для каждого индекса i. Кажется, что функция processALink () во втором потоке запускается до полного завершения processALink () в первом потоке.

Почему это происходит? Я думал, что использование async / wait предотвращает это.

forl oop находится внутри функции asyn c. Приведенный ниже код является просто фрагментом из исходного кода.

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

Функция def для processALink ()

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)
    }

  }

1 Ответ

1 голос
/ 12 января 2020

Удалите IIFE внутри processALink(), и это должно решить проблему запуска нескольких скриншотов одновременно.

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)
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...