async function* 表达式

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

async function* 关键字可用于在表达式内部定义异步生成器函数。

你还可以使用 async function* 声明来定义异步生成器函数。

试一试

async function joinAll(generator) {
  let str = "";
  for await (const val of generator()) {
    str += val;
  }
  return str;
}
joinAll(async function* () {
  yield await Promise.resolve("a");
  yield await Promise.resolve("b");
  yield await Promise.resolve("c");
}).then((str) => console.log(str));
// Expected output: "abc"

语法

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
}

注意: 表达式语句不能以 async function 关键字开头,以避免与 async function* 声明产生歧义。async function 关键字只在不能接受语句的上下文中才开始一个表达式。

参数

name 可选

函数名称。可以省略,这种情况下函数是匿名的。该名称仅在函数体内部局部有效。

paramN 可选

函数形式参数的名称。有关参数的语法,请参阅函数参考

statements 可选

构成函数体的语句。

描述

async function* 表达式与 async function* 声明非常相似,并且具有几乎相同的语法。async function* 表达式和 async function* 声明之间的主要区别是函数名称,在 async function* 表达式中可以省略函数名称以创建匿名函数。async function* 表达式可以用作 IIFE(立即调用的函数表达式),它在定义后立即运行,允许你创建临时的 异步可迭代对象。另请参阅有关 函数的章节以获取更多信息。

示例

使用 async function* 表达式

以下示例定义了一个未命名的异步生成器函数并将其赋值给 x。该函数产生其参数的平方

js
const x = async function* (y) {
  yield Promise.resolve(y * y);
};
x(6)
  .next()
  .then((res) => console.log(res.value)); // 36

规范

规范
ECMAScript® 2026 语言规范
# sec-async-generator-function-definitions

浏览器兼容性

另见