【问题标题】:Puppeteer define browser and page synchronouslyPuppeteer 同步定义浏览器和页面
【发布时间】:2019-12-29 17:22:48
【问题描述】:

在 Puppeteer 教程的开头,它说要这样做:

const puppeteer = require('puppeteer');
(async () => 
{
    await page.goto('https://example.com');
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await browser.close();
})();

这对我来说似乎很奇怪,因为整个事情都包装在一个异步函数中。如果我想等到完成后再继续呢?

编辑 - 为什么这对我来说很奇怪:
如果我的所有代码都依赖于浏览器会怎样,也就是说,在这个异步函数之外我无能为力。然后我的代码将如下所示:

//nothing up here
(async () => 
{
    //EVERYTHING is in here
})();
//nothing down here

这看起来很奇怪,因为我还不如同步地做所有事情,而不是把我的整个程序包装在一个异步函数中。

【问题讨论】:

  • 好吧,你不能,但async / await 的全部意义在于,你可以在browser.close 之前继续,无论你想从page 刮取什么,因为那时page将准备好被操纵。但是,async IFFE 本身将返回一个承诺,如果这是您的问题,您可以在其上连接一个不错的承诺链
  • 要定义一个页面,你首先需要一个浏览器......就像你需要先打开浏览器而不是打开其中的页面/标签一样......因此你需要同步运行它们并@ 987654328@ 是这样做的方法......也许async 关键字让你感到困惑

标签: javascript node.js asynchronous async-await puppeteer


【解决方案1】:

async 函数的原因

出于向后兼容性的原因,您需要将包含 await 指令的代码包装在 async 函数中。在 ES7 之前,您可以使用单词 await 作为变量或函数名称,这意味着这是有效的代码:

var await = 123;
console.log(await);

为了不与现有代码混淆,await 关键字只能在 async 函数中使用,这意味着要编写像 await page.goto(..) 这样的代码,您必须将它放在您正在使用的异步函数中。

等待代码完成

要等到代码完成,您可以在最后一个 await 语句之后继续,如下所示:

(async () => {
    // ...
    await browser.close();

    // continue with more code
})();

【讨论】:

  • 但是为什么 await 必须出现在异步函数中呢?是因为js是单线程的吗?
  • @JadenChaca 我试图在上面回答这个问题。什么不清楚?正如我在回答中解释的那样,这是出于向后兼容性的原因。
  • 你确定是这个原因吗?这似乎有点愚蠢。我认为这与线程有关。哦,好的,谢谢
  • @JadenChaca 找到similar question/answer,确认。一般来说async/await 只是包装Promises。它不会改变线程的工作方式。
猜你喜欢
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2021-11-06
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多