Puppeteer异步等待NodeJS中的循环

时间:2017-08-28 18:53:37

标签: javascript node.js asynchronous promise puppeteer

我正在尝试创建一个脚本:

  1. 从站点地图中抓取所有网址
  2. 用puppeteer
  3. 拍摄它的截图

    我目前正在尝试了解如何异步编码,但我仍然遇到了解决此问题的正确编码模式的麻烦。 这是我目前的代码:

    
    
    // const spider = require('./spider');
    const Promise = require('bluebird');
    const puppeteer = require('puppeteer');
    const SpiderConstructor = require('sitemapper');
    
    async function crawl(url, timeout) {
      const results = await spider(url, timeout);
      await Promise.each(results, async (result, index) => {
        await screen(result, index);
      });
    }
    
    async function screen(result, index) {
      const browser = await puppeteer.launch();
      console.log('doing', index);
      const page = await browser.newPage();
      await page.goto(result);
      const path = await 'screenshots/' + index + page.title() + '.png';
      await page.screenshot({path});
      browser.close();
    }
    
    async function spider(url, timeout) {
      const spider = await new SpiderConstructor({
        url: url,
        timeout: timeout
      });
      const data = await spider.fetch();
      console.log(data.sites.length);
      return data.sites;
    };
    
    crawl('https://www.google.com/sitemap.xml', 15000)
      .catch(err => {
        console.error(err);
      });
    
    
    

    我遇到以下问题:

    • 结果数组的长度不是常数,每次启动脚本时都会有所不同,我想这是因为当我显示它时它没有完全解析,但我认为等待的重点是如此我们保证在下一行承诺得到解决。
    • 脚本的实际截屏操作部分没有一半时间工作,我很确定我有未解决的承诺,但我没有实际循环异步函数的模式,现在看来它似乎一个接一个的截图(线性和增量),但我得到了很多重复。

    感谢任何帮助。谢谢你的时间

0 个答案:

没有答案