保证异步代码不起作用

时间:2018-08-10 08:41:02

标签: javascript puppeteer

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
    const page = await browser.newPage();
    var urls = ['https://www.google.com','https://www.firefox.com'];
    await Promise.all(urls.map(async (url) => {
        await page.goto(url, { timeout: 0, waitUntil: "networkidle2" });
        console.log(page.url());
    }))
    await browser.close();
});

此代码返回数组最后一个URL的2倍,为什么?

https://www.mozilla.org/en-US/firefox/new/?utm_medium=referral&utm_source=firefox-com https://www.mozilla.org/en-US/firefox/new/?utm_medium=referral&utm_source=firefox-com

2 个答案:

答案 0 :(得分:1)

您传递给map的函数在每个URL上并行运行

您只能远程控制一个浏览器

因此,您将其告诉goto一页,然后await进行响应,以便选择下一个函数。它告诉浏览器转到不同页面,该页面取消了尝试转到第一页的尝试。当到达该页面时,两个诺言都会得到“我已经到达!”。消息并选择读取数据。

您需要遍历URL,并以顺序而不是并行运行它们。

答案 1 :(得分:0)

@Quentin的答案说明为什么发生这种情况,此外,我想添加一个代码示例,说明如何依次进行。在以下示例中,浏览器将一个接一个地访问这些页面:

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {
    const page = await browser.newPage();
    let urls = ['https://www.google.com', 'https://www.firefox.com'];

    for (let i = 0; i < urls.length; i++) {
        await page.goto(urls[i], {timeout: 0, waitUntil: "networkidle2"});
        console.log(page.url());
    }

    await browser.close();
});

如果您要同时访问这些页面,则可以在浏览器中打开两个页面并执行类似的操作,这将比上一个示例更快:

const puppeteer = require('puppeteer');
puppeteer.launch().then(async browser => {

    let urls = ['https://www.google.com', 'https://www.firefox.com'];
    await Promise.all(urls.map((url) => {
        return new Promise(async (resolve, reject) => {
            // Open new page for each url
            let page = await browser.newPage();
            await page.goto(url, {timeout: 0, waitUntil: "networkidle2"});
            console.log(page.url());
            resolve();
        });
    }));

    await browser.close();
});