首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在何处调用for循环以遍历值的数组

在何处调用for循环以遍历值的数组
EN

Stack Overflow用户
提问于 2018-06-04 08:04:20
回答 2查看 257关注 0票数 0

我有一个javascript函数,我正在用它来擦除,我正在用它来做木偶。如果我使用一个值,它可以工作,但是如果我为它引入一个for循环来迭代一个值数组,它就会失败。我想知道引入for循环的正确位置。

这是我的基本工作脚本:

代码语言:javascript
复制
const puppeteer = require('puppeteer');
var listOfURLs = [url1, url2,url3,url4,url5]
let scrape = async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(listOfURLs[0]);

  const result = await page.evaluate(() => {
    let title = document.querySelector('#innerLeft > div.dspPropertyTitle > h1').innerText;
    return {
      title
    }

  });

  browser.close();
  return result;
};
scrape().then((value) => {
  console.log(value); 
});

我的URL包含在变量listOfURLs中。如果我手动引用listOfURL,就像上面的例子一样,它工作得很好。现在我希望它循环遍历整个数组,并以listOfURLsi的形式访问值,所以我尝试了一下,但它不起作用。我不知道哪里出了问题。

代码语言:javascript
复制
const puppeteer = require('puppeteer');    
var listOfURLs = [url1, url2, url3, url4, url5]
for (i=0; i<=listOfURLs.length; i++) {
  let scrape = async () => {
    const browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();

    await page.goto(listOfURLs[i]);

    const result = await page.evaluate(() => {
      let title = document.querySelector('#innerLeft > div.dspPropertyTitle > h1').innerText;
      return {
        title
      }

    });

    browser.close();
    return result;
  };
  scrape().then((value) => {
    console.log(value); 
  });
}
EN

回答 2

Stack Overflow用户

发布于 2018-06-04 08:08:33

i被提升,并且scrape是异步的-在一开始的scrape awaits之后,for循环将结束,因此i将变为listOfURLs.length + 1,这意味着稍后访问listOfURLs[i]将不起作用。

改为使用let,这样每次迭代都有一个单独的i绑定。

您还应该测试i < listOfURLs.length,而不是i <= listOfURLs.length,因为i < listOfURLs[listOfURLs.length]将是未定义的:

代码语言:javascript
复制
for (let i=0; i < listOfURLs.length; i++) {

但是这些类型的for循环非常丑陋,而且经常会出现这样的问题--你可以考虑forEach,它有更好的抽象,有函数作用域(可组合),并且不需要手动迭代,如果你可以并行发送请求:

代码语言:javascript
复制
listOfURLs.forEach(async (url) => {
  const scrape = async () => {
    const browser = await puppeteer.launch({headless: true});
    const page = await browser.newPage();
    await page.goto(url);
    const result = await page.evaluate(() => {
      const title = document.querySelector('#innerLeft > div.dspPropertyTitle > h1').innerText;
      return { title };
    });
    browser.close();
    return result;
  };
  scrape().then((value) => {
    console.log(value); 
  });
});

(如果您想以串行方式发出请求,则使用数组方法的另一个选项是reduce )

票数 1
EN

Stack Overflow用户

发布于 2018-06-04 08:08:30

您的问题可能源于在for循环中进行异步调用的事实。在进入下一个url之前,你想要一个结果,因为它是异步的,所以你的代码不会等待响应并继续到数组中的下一个url。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50672049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档