javascript类中异步生成器方法必须写作async *方法名(),顺序固定、不可颠倒或加空格;方法内可await和yield,返回asynciterator,须用for await...of消费。

在 JavaScript 类中,异步生成器方法的写法很直接:在方法名前**同时写上 async 和 *(星号)**,顺序固定为 async *,不能颠倒,也不能加空格。它不是两个独立修饰符的组合,而是一个整体语法标记,表示这是一个“异步生成器函数”。
语法结构必须是 async *
类方法声明时,async 必须紧挨着 *,且 * 紧贴在 function 关键字之后(隐式)或方法名之前(显式)。ES 规范只认 async * 这一种形式:
- ✅ 正确:
async * fetchData()、async * streamEvents() - ❌ 错误:
async fetchData*()、* async fetchData()、async *fetchData()(*前缺空格虽不报错但属非标准风格,建议统一加空格)
方法体内可 await + yield
异步生成器方法内部可以自由使用 await 等待 Promise,也能用 yield 向外产出值。每次 yield 后,执行会暂停;下次迭代时从暂停处继续,并可再次 await:
-
yield的值会被自动await(如果它是 Promise),再传给消费者 - 你也可以显式写
yield await someAsyncOp(),语义更清晰 - 支持
try/catch捕获异步过程中的错误
调用后返回 AsyncIterator,要用 for await...of
类实例调用该方法,返回的是一个 异步迭代器(AsyncIterator),不是普通迭代器,也不能用 for...of 直接遍历:
- ✅ 正确消费方式:
for await (const item of instance.asyncGenMethod()) { ... } - ✅ 也可手动调用:
const it = instance.asyncGenMethod(); const { value, done } = await it.next(); - ❌ 错误:
for (const item of instance.asyncGenMethod())—— 会立即遍历未解析的 Promise
实际例子:分页拉取数据流
比如一个 DataLoader 类,用异步生成器按需获取分页数据:
class DataLoader {
constructor(baseUrl) {
this.baseUrl = baseUrl;
}
<p>async * fetchPages(limit = 10) {
let page = 1;
while (true) {
try {
const res = await fetch(<code>${this.baseUrl}/items?page=${page}&limit=${limit}</code>);
const items = await res.json();
if (items.length === 0) break;
yield items; // 每次产出一页数据
page++;
} catch (err) {
console.error('加载失败', err);
break;
}
}
}
}</p><p>// 使用
const loader = new DataLoader('<a href="https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39">https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39</a>');
(async () => {
for await (const page of loader.fetchPages(5)) {
console.log('收到一页:', page.length, '项');
}
})();</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











