AsyncGenerator
AsyncGenerator 对象由异步生成器函数返回,并且它符合异步可迭代协议和异步迭代器协议。
异步生成器方法总是产生 Promise 对象。
尝试一下
构造函数
AsyncGenerator 构造函数并不是全局的。AsyncGenerator 的实例必须从异步生成器函数返回。
js
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.prototype 并由所有 AsyncGenerator 实例共享。
AsyncGenerator.prototype.constructor-
用于创建实例对象的构造函数。对于
AsyncGenerator实例,初始值是AsyncGeneratorFunction.prototype。备注:
AsyncGenerator对象并不会存储将它们创建的异步生成器函数的引用。 AsyncGenerator.prototype[@@toStringTag]-
@@toStringTag属性的初始值是字符串"AsyncGenerator"。该属性在Object.prototype.toString()中使用。
实例方法
AsyncGenerator.prototype.next()(en-US)AsyncGenerator.prototype.return()(en-US)-
就好像在生成器的暂停位置插入一个
return语句,这将结束生成器并允许生成器执行任何清理的renew,尤其是与try...finally块结合的时候。 AsyncGenerator.prototype.throw()(en-US)-
就好像在生成器的暂停位置插入一个
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(100, 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));
规范
| Specification |
|---|
| ECMAScript Language Specification # sec-asyncgenerator-objects |
浏览器兼容性
BCD tables only load in the browser