首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在异步函数中重置for循环?

如何在异步函数中重置for循环?
EN

Stack Overflow用户
提问于 2019-11-20 23:30:59
回答 1查看 444关注 0票数 2

所以我找到了一个网站,它有非常酷的图片,我想要刮掉一些它的数据。这个网站已经有5年没有更新了,我试着联系它的主人获取一些API,但是我没有得到任何回应。

无论如何,网站有类别,每个图片都有自己的页码;所以为了抓取每个图片,我需要转到每个类别,然后转到那个特定类别的每个页面。

下面是我的代码,但是我不能让for loop重置。

代码语言:javascript
复制
const {Cluster} = require('puppeteer-cluster');
const puppeteer = require('puppeteer');

let c = 0;
let z = 500;
(async () => {
    process.setMaxListeners(5);
    const cluster = await Cluster.launch({
        maxConcurrency: 3 // max browsers to spawn at the same time
    });
    let b = 20;
    for (let i = 0; i < b; i++) {
        cluster.execute({i}, async () => {
            let browser = await puppeteer.launch({headless: false});
            // scraping code using the i and c values
            await browser.close();
            console.log(i);
            if (i > b - 10) {
                i = 0;
                c = c + 1;
                console.log('c = ' + c);
                if (c > z)
                    process.exit();
            }
        });
    }
    await cluster.idle();
    await cluster.close();
})();

这是输出(顺序不是必需的):

代码语言:javascript
复制
1
0
2
4
3
5
6
7
8
9
10
11
c = 1
12
c = 2
13
c = 3
14
c = 4
16
c = 5
15
c = 6
17
c = 7
18
c = 8
19
c = 9

Process finished with exit code 0

如果我在cluster.execute前面添加await,那么for loop将被重置,但是我不能同时使用多个浏览器。

编辑:

代码语言:javascript
复制
const {Cluster} = require('puppeteer-cluster');
const puppeteer = require('puppeteer');

(async () => {
    process.setMaxListeners(5);
    const cluster = await Cluster.launch({maxConcurrency: 3});
    let b = 15;

    let d;

    function myLoop() {
        let g = 0;
        for (g; g <= n; g++) {
            console.log(g);
            myFunc();
        }
        return g;
    }
    d = myLoop();
    console.log('d: ' + d);
    if (d > 0)
        myLoop();

    async function myFunc() {
        await cluster.execute(async () => {
            let browser = await puppeteer.launch({headless: false});
            await browser.close();
        });
    }

    await cluster.idle();
    await cluster.close();
})();
EN

回答 1

Stack Overflow用户

发布于 2019-11-20 23:56:54

我认为问题可能是由let引起的,let只存在于当前的代码块中,试着做一个函数。差不多吧。

代码语言:javascript
复制
let i = 0; // page index
let n = 0; // number of pages 
let c = 0; // category index
let nc = 0; // number of categorys
for(i = 0; i < n; i++)
{
   for(c = 0; c < nc; c++)
   {
     postrequest(i,c)
   }
} 

postrequest(pageindex,categoryindex)
{
  // Do your async call ... 
}

如果我没有抓住问题的要点,很抱歉....

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

https://stackoverflow.com/questions/58957989

复制
相关文章

相似问题

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