异步函数(async function)表达式

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.

async function 关键字可用于定义表达式中的异步函数。

你还可以使用异步函数声明

语法

js
async function (param0) {
  statements
}
async function (param0, param1) {
  statements
}
async function (param0, param1, /* … ,*/ paramN) {
  statements
}

async function name(param0) {
  statements
}
async function name(param0, param1) {
  statements
}
async function name(param0, param1, /* … ,*/ paramN) {
  statements
}

异步函数也可以使用箭头语法进行定义。

参数

name 可选

函数名称,可省略。如果省略则这个函数将成为匿名函数。该名称仅可在本函数中使用。

paramN 可选

传入函数的形参名称。

statements 可选

构成函数主体的语句。

描述

async function 表达式与异步函数语句非常相似,语法也基本相同。异步 function 表达式和异步 function 语句之间的主要区别在于函数名称,它可以在 async function 表达式中省略,从而创建一个匿名函数。async function 表达式可以用作 IIFE(立即执行函数表达式,Immediately Invoked Function Expression),它在定义后立即运行。参见函数章节以获取更多信息。

示例

简单示例

js
function resolveAfter2Seconds(x) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

// 赋值给变量的异步函数表达式
const add = async function (x) {
  const a = await resolveAfter2Seconds(20);
  const b = await resolveAfter2Seconds(30);
  return x + a + b;
};

add(10).then((v) => {
  console.log(v); // 4 秒后打印 60
});

// 用作 IIFE 的异步函数表达式
(async function (x) {
  const p1 = resolveAfter2Seconds(20);
  const p2 = resolveAfter2Seconds(30);
  return x + (await p1) + (await p2);
})(10).then((v) => {
  console.log(v); // 2 秒后打印 60
});

规范

Specification
ECMAScript Language Specification
# sec-async-function-definitions

浏览器兼容性

BCD tables only load in the browser

参见