js 不会等到承诺完成

时间:2021-02-08 16:36:38

标签: javascript node.js async-await puppeteer

我试图在 puppeteer 的帮助下从网站获取一些链接。

async function getLinks(){

    
    const first = 'first';
    const last = 'last';

    const browser = await browserControl.startBrowser();
    const page = await browser.newPage();

    await page.goto(url_baseStats);
    // await page.waitForNavigation();

    let links = await page.evaluate((first, last) => {
        try {
            let links = Array.from(document.querySelectorAll('a'), a => a.getAttribute('href'));
            links = links.slice(links.indexOf(first), links.indexOf(last));
            return links;
        } catch(err) {
            throw err;
        }
    });
    
    console.log("links:", links);
    return links;
    
}

我有两个问题:

  1. 当我运行调试器时,他进入“await page.evaluate((...”-point 然后跳转 直接到“console.log(...”。他为什么不等?

  2. 为什么我需要将变量 first 和 last 作为参数传递给评估函数? 我上面定义了它们,它们应该在评估函数的范围内?!?

提前致谢;_)

1 个答案:

答案 0 :(得分:1)

仅供后来的观众,评论摘要:

在 page.evaluate() 函数中运行的所有内容都是在浏览器页面的上下文中完成的。该脚本在浏览器中运行,而不是在 node.js 中运行。因此,一些常用的 js 规则在这里无效。 例如:

  1. 如果您记录任何内容,它将显示在浏览器控制台中,如果您无头运行,您将看不到。
  2. 你也不能在函数内部设置节点断点
  3. 通常的作用域无效,需要传递参数

;_)