【问题标题】:Why this async function syntax for puppeteer? [duplicate]为什么这个 puppeteer 的异步函数语法? [复制]
【发布时间】:2021-01-10 07:55:12
【问题描述】:

我正在研究如何使用Puppeteer 进行测试,我遇到的所有代码示例都使用以下语法:

(async () => {
    //function body
})();

现在我的问题不仅仅是它的作用,因为我了解异步函数是什么。我想知道的是这个语法是什么意思,它是如何解析的?我是 Node.js 和 Puppeteer 的新手,我以前从未见过这种情况。我找到的教程都没有解释这里发生了什么。

我找到了this,它解释了=> 运算符的用途。所以看起来async () => 就像async function () 的简写?我仍然很困惑为什么整个内容都被括号包围,然后是另一对括号。

MDN 表明您可以使用async function fname() {...} 在javascript 中声明一个异步函数。这似乎很简单。那么为什么不使用这种语法呢?有什么区别?

【问题讨论】:

  • 你想用谷歌搜索的词是 IIFE。 IIFE 与异步无关,但在这种情况下,它与异步函数一起使用。通常你会同步调用 IIFE。 IIFE 的全部意义在于创建一个新范围,以便该函数内部的变量不会对外部的所有其他内容可见
  • 这是一个异步立即调用的函数表达式。有关说明,请参阅 benalman.com/news/2010/11/…。它只是创建一个异步函数范围来包含一些您希望在其自己的范围内隔离的代码,或者在这种情况下,您希望是异步的。它是定义命名函数然后调用它的简写。

标签: javascript node.js asynchronous puppeteer


【解决方案1】:

async 函数被括号括起来,然后是一个尾随(),以便立即调用该函数。更详细的解释见the article about IIFE on MDN

这可能是因为当前版本的 Node.js 不支持顶级等待。

$ node
Welcome to Node.js v14.12.0.
Type ".help" for more information.
> async function foo() { return Promise.resolve(true); }
undefined
> await foo()
await foo()
^^^^^

Uncaught SyntaxError: await is only valid in async function
> 

【讨论】:

    【解决方案2】:

    你看到的是一个自执行匿名函数,也称为IIFE

    (async () => {
        //function body
    })();
    

    如您所见,该函数没有名称。并且它的自我执行,因为最后有()

    同样的也可以这样写。

    async function SomeFunctionName() {
        //function body
    };
    
    SomeFunctionName();
    

    那为什么不使用这种语法呢?有什么区别?

    您的示例不使用上述代码中提到的函数名和=>(箭头函数)的原因可能是这样的

    1. 此函数用于初始化某些代码,其他任何地方都没有使用。
    2. 获取benefits of arrow functions

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2016-12-18
      • 2021-02-03
      • 2021-01-15
      • 2015-08-08
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 2023-01-23
      相关资源
      最近更新 更多