• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • AsyncFunction

    AsyncFunction构造函数用来创建新的异步函数对象。JavaScript 中每个异步函数都是AsyncFunction对象。

    注意,AsyncFunction不是全局对象,需要通过下面的方法来获取:

    const AsyncFunction = (async function () {}).constructor;
    


    语法

    new AsyncFunction(functionBody)
    new AsyncFunction(arg0, functionBody)
    new AsyncFunction(arg0, arg1, functionBody)
    new AsyncFunction(arg0, arg1, /* … ,*/ argN, functionBody)
    
    AsyncFunction(functionBody)
    AsyncFunction(arg0, functionBody)
    AsyncFunction(arg0, arg1, functionBody)
    AsyncFunction(arg0, arg1, /* … ,*/ argN, functionBody)
    

    备注:调用AsyncFunction()时可以选择使用或不使用new运算符。两者都会创建一个新的AsyncFunction实例。


    参数

    argN可选

    函数的参数名,它们必须是符合 JavaScript 参数规范(任何标识符、剩余参数或解构参数,以及可选的默认参数值)的字符串。

    由于参数的解析方式与函数声明相同,参数中接受空格和注释。例如:"x","theValue = 42","[a, b]/* numbers */""x, theValue = 42,[a, b]/* numbers */"。("x, theValue = 42","[a, b]"也是正确的,但这容易造成困扰。)

    functionBody

    包含 JavaScript 语句的字符串,这些语句组成了新函数的定义。


    描述

    执行AsyncFunction构造函数的时候,会创建一个异步函数对象。但是这种方式不如使用async function表达式定义一个异步函数,然后再调用它来的高效,因为后者的函数是与其它代码一起被解释器解析的。

    传递给函数的所有参数(除了最后一个)都会成为新函数中的变量,变量的名称和定义顺序与各参数相同。

    备注:AsyncFunction构造函数创建的异步函数并不会在当前上下文中创建闭包,其作用域始终是全局的。

    因此运行的时候只能访问它们自己的局部变量和全局变量,而不能访问AsyncFunction构造函数被调用的那个作用域中的变量。

    这是它与使用eval来创建异步函数表达式不同的地方。

    调用AsyncFunction构造函数时可以省略new,其效果是一样的。


    示例

    通过 AsyncFunction()构造函数创建一个异步函数

    function resolveAfter2Seconds(x) {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve(x);
        }, 2000);
      });
    }
    
    const AsyncFunction = (async function () {}).constructor;
    
    const fn = new AsyncFunction(
      'a',
      'b',
      'return await resolveAfter2Seconds(a) + await resolveAfter2Seconds(b);',
    );
    
    fn(10, 20).then((v) => {
      console.log(v); // 4 秒后打印 30
    });