async function*

async function* 声明会为给定名称创建一个新的异步生成器函数的 绑定

您也可以使用 async function* 表达式 定义异步生成器函数。

试一试

语法

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

注意: 异步生成器函数没有箭头函数对应项。

注意: function* 是单独的标记,因此它们可以用 空格或行终止符 分隔。但是,asyncfunction 之间不能有行终止符,否则会 自动插入分号,导致 async 成为标识符,而其余部分成为 function* 声明。

参数

名称

函数名称。

param 可选

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

statements 可选

构成函数体的语句。

描述

async function* 声明创建一个 AsyncGeneratorFunction 对象。每次调用异步生成器函数时,它都会返回一个新的 AsyncGenerator 对象,它符合 异步迭代器协议。每次调用 next() 都会返回一个 Promise,它解析为迭代器结果对象。

异步生成器函数结合了 异步函数生成器函数 的功能。您可以在函数体内使用 awaityield 关键字。这使您能够使用 await 以符合人体工程学的方式处理异步任务,同时利用生成器函数的延迟性质。

当从异步生成器中产生一个 Promise 时,迭代器结果 Promise 的最终状态将与所产生的 Promise 的状态匹配。例如

js
async function* foo() {
  yield Promise.reject(1);
}

foo()
  .next()
  .catch((e) => console.error(e));

将记录 1,因为如果所产生的 Promise 拒绝,迭代器结果也将拒绝。异步生成器已解析结果的 value 属性不会是另一个 Promise。

async function* 声明的行为类似于 function 声明 - 它们被 提升 到其范围的顶部,可以在其范围内的任何地方调用,并且只能在某些上下文中重新声明。

示例

声明异步生成器函数

异步生成器函数始终产生结果 Promise - 即使每个 yield 步骤都是同步的。

js
async function* myGenerator(step) {
  await new Promise((resolve) => setTimeout(resolve, 10));
  yield 0;
  yield step;
  yield step * 2;
}

const gen = myGenerator(2);
gen
  .next()
  .then((res) => {
    console.log(res); // { value: 0, done: false }
    return gen.next();
  })
  .then((res) => {
    console.log(res); // { value: 2, done: false }
    return gen.next();
  })
  .then((res) => {
    console.log(res); // { value: 4, done: false }
    return gen.next();
  })
  .then((res) => {
    console.log(res); // { value: undefined, done: true }
    return gen.next();
  });

使用异步生成器函数读取一系列文件

在此示例中,我们读取了一系列文件,并且仅在请求时访问其内容,使用 Node 的 fs/promises 模块。

js
async function* readFiles(directory) {
  const files = await fs.readdir(directory);
  for (const file of files) {
    const stats = await fs.stat(file);
    if (stats.isFile()) {
      yield {
        name: file,
        content: await fs.readFile(file, "utf8"),
      };
    }
  }
}

const files = readFiles(".");
console.log((await files.next()).value);
// Possible output: { name: 'file1.txt', content: '...' }
console.log((await files.next()).value);
// Possible output: { name: 'file2.txt', content: '...' }

规范

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

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅