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 January 2020.

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

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

尝试一下

async function* foo() {
  yield await Promise.resolve("a");
  yield await Promise.resolve("b");
  yield await Promise.resolve("c");
}

let str = "";

async function generate() {
  for await (const val of foo()) {
    str = str + val;
  }
  console.log(str);
}

generate();
// 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

规范

Specification
ECMAScript® 2025 Language Specification
# sec-async-generator-function-definitions

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
async function* expression

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见