异步生成器
AsyncGenerator
对象由 异步生成器函数 返回,它符合 异步可迭代协议和异步迭代器协议。
异步生成器方法始终生成 Promise
对象。
AsyncGenerator
是隐藏的 AsyncIterator
类的子类。
试试
构造函数
没有与 AsyncGenerator
构造函数相对应的 JavaScript 实体。AsyncGenerator
的实例必须从 异步生成器函数 返回
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()
AsyncGenerator.prototype.return()
-
就像在生成器的正文中当前挂起的位置插入
return
语句一样,这将完成生成器并允许生成器在与try...finally
块组合时执行任何清理任务。 AsyncGenerator.prototype.throw()
-
就像在生成器的正文中当前挂起的位置插入
throw
语句一样,这会通知生成器发生错误情况,并允许它处理错误或执行清理并关闭自身。
示例
异步生成器迭代
以下示例迭代异步生成器,以递减的时间间隔将值 1-6 记录到控制台。请注意,每次都会生成一个 Promise,但它会在 for await...of
循环中自动解析。
// 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 语言规范 # sec-asyncgenerator-objects |
浏览器兼容性
BCD 表格仅在浏览器中加载