Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js不会等到承诺兑现_Javascript_Node.js_Async Await_Puppeteer - Fatal编程技术网

Javascript js不会等到承诺兑现

Javascript js不会等到承诺兑现,javascript,node.js,async-await,puppeteer,Javascript,Node.js,Async Await,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); /

我想在木偶师的帮助下从一个网站上获得一些链接

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;
    
}
我有两个问题:

  • 当我运行调试器时,他进入“wait page.evaluate((…”)点,然后跳转 直接到“console.log(…”。他为什么不等

  • 为什么我需要将变量作为参数首先和最后传递给求值函数? 我在上面定义了它们,它们应该在评估功能的范围内


  • 提前感谢;41;

    仅供以后的观众参考,评论摘要:

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

  • 如果您记录了任何内容,它将显示在浏览器控制台中,如果您运行headless,您将看不到该控制台
  • 也不能在函数内设置节点断点
  • 没有有效的常规作用域,您需要传递参数

  • )

    是时候进行更多的调试了:让你的函数在捕获后也返回一个值,这样你就可以检查它是否真的立即出错了。至于为什么你需要传递第一个和最后一个:,除非你想从“不在浏览器中运行”中得到值要将上下文传递到浏览器上下文中,则需要执行此操作。在这种情况下,您似乎忘记设置
    evaluate(…,first,last)
    ,以便将这两个值加入到函数中。显然(根据文档)
    page.evaluate()
    仅在函数回调返回承诺时才会等待。(文档不是很清楚。)我不知道为什么也有
    first
    last
    .evaluate()
    回调函数的参数应该在
    .evaluate()中的回调函数之后传递
    调用自身。它们为什么在那里?您希望它们有什么值?编辑哦,等等;是的,从回调函数中取出参数
    first,last
    。事实上,它们将
    未定义
    ,因此回调不会像您期望的那样工作。然后您必须将
    first
    last
    作为第二个和第三个参数传递
    .evaluate()
    调用的d个参数。(并将参数放回原位。)函数作为文本从节点域传输到浏览器域,因此正常的作用域规则没有意义。