JavaScript AsyncGenerator

原创
admin 4个月前 (08-19) 阅读数 18 #JavaScript

AsyncGenerator

AsyncGenerator 对象由异步生成器函数返回,并且它符合异步可迭代协议和异步迭代器协议。异步生成器方法总是产生 Promise 对象。AsyncGenerator 是隐藏类 AsyncIterator 的子类。

AsyncGenerator 构造函数并非全局可用的。AsyncGenerator 的实例必须从异步生成器函数返回。

实际上,并没有对应 AsyncGenerator 构造函数的 JavaScript 实体。只有一个隐藏对象,其是所有由异步生成器函数创建的对象所共享的原型对象。这个对象通常被风格化为 AsyncGenerator.prototype 来使其看起来像是一个类。

实例属性

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

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

AsyncGenerator.prototype[Symbol.toStringTag] 属性的初始值是字符串 "AsyncGenerator"。该属性在 Object.prototype.toString() 中使用。

实例方法

AsyncGenerator 也从其父类 AsyncIterator 继承实例方法。

AsyncGenerator.prototype.next() 返回 Promise,它将通过 yield 表达式产生的给定值兑现。

AsyncGenerator.prototype.return() 就好像在生成器的暂停位置插入一个 return 语句,这将结束生成器并允许生成器执行任何清理任务,尤其是与 try...finally 块结合的时候。

AsyncGenerator.prototype.throw() 就好像在生成器的暂停位置插入一个 throw 语句,这将通知生成器错误的状况并允许去处理错误,或者执行清理操作并关闭它自己。

示例

以下示例将遍历迭代异步生成器,以递减的时间间隔将值 1-6 打印到控制台。注意,每次产生 Promise 的时候,它会在 for await...of 循环中自动地兑现。

// 异步任务。假设它在实践中做了一些更有用的事情。
function delayedValue(time, value) {
  return new Promise((resolve /*, reject*/) => {
    setTimeout(() => resolve(value), time);
  });
}

async function* generate() {
  yield delayedValue(2000, 1);
  yield delayedValue(100, 2);
  yield delayedValue(500, 3);
  yield delayedValue(250, 4);
  yield delayedValue(125, 5);
  yield delayedValue(50, 6);
  console.log("全部完成!");
}

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

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

规范

AsyncGenerator 的规范可以在 ECMAScript® 2026 Language Specification 中找到。

浏览器兼容性

AsyncGenerator 在现代浏览器中得到了广泛支持,包括 Chrome、Firefox、Safari 和 Edge。该功能自 2020 年 1 月起已在所有主流浏览器中可用。

参见

  • function*
  • async function*
  • function* 表达式
  • 生成器函数
  • 异步生成器函数
  • 迭代器和生成器指南
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。

作者文章
热门
最新文章
标签列表