AsyncGenerator
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.
AsyncGenerator
对象由异步生成器函数返回,并且它符合异步可迭代协议和异步迭代器协议。
异步生成器方法总是产生 Promise
对象。
AsyncGenerator
是隐藏类 AsyncIterator
的子类。
尝试一下
构造函数
AsyncGenerator
构造函数并非全局可用的。AsyncGenerator
的实例必须从异步生成器函数返回。
async function* createAsyncGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(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
构造函数的 JavaScript 实体。只有一个隐藏对象,其是所有由异步生成器函数创建的对象所共享的原型对象。这个对象通常被风格化为 AsyncGenerator.prototype
来使其看起来像是一个类,但它更恰当的称呼应该是 AsyncGenerator.prototype.prototype
,因为 AsyncGeneratorFunction
是一个实际的 JavaScript 实体。
实例属性
这些属性定义在 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
循环中自动地兑现。
// 异步任务。假设它在实践中做了一些更有用的事情。
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));
规范
Specification |
---|
ECMAScript Language Specification # sec-asyncgenerator-objects |
浏览器兼容性
BCD tables only load in the browser