AsyncGenerator

Baseline 已广泛支持

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

AsyncGenerator 对象由一个 异步生成器函数 返回,它符合 异步可迭代协议和异步迭代器协议

异步生成器函数总是会生成 Promise 对象。

AsyncGenerator 是隐藏的 AsyncIterator 类的子类。

构造函数

没有 JavaScript 实体与 AsyncGenerator 构造函数相对应。AsyncGenerator 实例必须由 异步生成器函数 返回。

js
async function* createAsyncGenerator() {
  yield Promise.resolve(1);
  yield await Promise.resolve(2);
  yield 3;
}
const asyncGen = createAsyncGenerator();
asyncGen.next().then((res) => console.log(res.value)); // 1
asyncGen.next().then((res) => console.log(res.value)); // 2
asyncGen.next().then((res) => console.log(res.value)); // 3

只有一个隐藏对象,它是所有由异步生成器函数创建的对象共享的原型对象。这个对象通常被风格化为 AsyncGenerator.prototype,使其看起来像一个类,但更恰当地说,它应该被称为 AsyncGeneratorFunction.prototype.prototype,因为 AsyncGeneratorFunction 是一个实际的 JavaScript 实体。要理解 AsyncGenerator 实例的原型链,请参阅 AsyncGeneratorFunction.prototype.prototype

实例属性

这些属性定义在 AsyncGenerator.prototype 上,并由所有 AsyncGenerator 实例共享。

AsyncGenerator.prototype.constructor

创建实例对象的构造函数。对于 AsyncGenerator 实例,初始值为 AsyncGeneratorFunction.prototype

注意: AsyncGenerator 对象不存储对其创建它们的异步生成器函数的引用。

AsyncGenerator.prototype[Symbol.toStringTag]

[Symbol.toStringTag] 属性的初始值为字符串 "AsyncGenerator"。此属性用于 Object.prototype.toString()

实例方法

还继承了其父级 AsyncIterator 的实例方法。.

AsyncGenerator.prototype.next()

返回一个 Promise,该 Promise 将在 yield 表达式产生的值处解析。

AsyncGenerator.prototype.return()

如同在生成器的当前暂停位置的体中插入了 return 语句一样,它会完成生成器,并允许生成器在与 try...finally 块结合使用时执行任何清理任务。

AsyncGenerator.prototype.throw()

如同在生成器的当前暂停位置的体中插入了 throw 语句一样,它会通知生成器发生错误条件,并允许它处理错误,或执行清理并关闭自身。

示例

异步生成器迭代

以下示例迭代一个异步生成器,以递减的时间间隔将值 1-6 记录到控制台。请注意,每次生成一个 Promise,它都会在 for await...of 循环中自动解析。

js
// An async task. Pretend it's doing something more useful
// in practice.
function delayedValue(time, value) {
  return new Promise((resolve /*, reject */) => {
    setTimeout(() => resolve(value), time);
  });
}

async function* generate() {
  yield delayedValue(2000, 1);
  yield delayedValue(1000, 2);
  yield delayedValue(500, 3);
  yield delayedValue(250, 4);
  yield delayedValue(125, 5);
  yield delayedValue(50, 6);
  console.log("All done!");
}

async function main() {
  for await (const value of generate()) {
    console.log("value", value);
  }
}

main().catch((e) => console.error(e));

规范

规范
ECMAScript® 2026 语言规范
# sec-asyncgenerator-objects

浏览器兼容性

另见