异步生成器通过async function*定义,结合for await...of可优雅处理异步数据流,如分页请求、事件流等场景,自动实现异步迭代器协议,简化异步序列操作。

异步迭代器与生成器结合使用,可以让开发者更优雅地处理异步数据流。JavaScript中的async function*语法正是为此设计的。通过在生成器函数前加上async关键字,可以创建一个异步生成器,它返回一个符合异步迭代器协议的对象。
异步生成器函数使用 async function* 定义,可以在其中使用 await 并通过 yield 返回异步结果。
yield 可以返回一个 Promise,自动被包装为异步迭代项await 可用于等待异步操作完成for await...of 消费示例:模拟逐个获取远程数据
async function* fetchUsers() {
const userIds = [1, 2, 3, 4];
for (const id of userIds) {
const response = await fetch(`/api/users/${id}`);
const user = await response.json();
yield user;
}
}
<p>// 使用 for await...of 遍历
for await (const user of fetchUsers()) {
console.log(user.name);
}
一个异步迭代器需实现 next() 方法,该方法返回一个 Promise,Promise 的结果是 { value, done } 结构。
立即学习“Java免费学习笔记(深入)”;
value 是当前产出的值done 表示是否已结束(true 表示结束)手动实现一个异步迭代器虽然可行,但使用异步生成器更简洁:
async function* countdown(from) {
for (let i = from; i > 0; i--) {
await new Promise(resolve => setTimeout(resolve, 1000));
yield i;
}
}
<p>for await (const tick of countdown(3)) {
console.log(tick); // 每秒输出 3, 2, 1
}
这种组合特别适合处理分页数据、事件流或需要延迟处理的队列任务。
例如,处理分页 API:
async function* paginatedAPI(url) {
let page = 1;
while (true) {
const res = await fetch(`${url}?page=${page}`);
const data = await res.json();
if (data.items.length === 0) break;
for (const item of data.items) {
yield item;
}
page++;
}
}
<p>for await (const item of paginatedAPI('/logs')) {
console.log(item);
}
基本上就这些。异步生成器简化了异步序列的构建和消费,配合 for await...of 能写出清晰且高效的流式代码。不复杂但容易忽略的是,每个 yield 的值会被自动 Promise 化,无需手动包装。
以上就是JavaScript中的异步迭代器与生成器如何结合使用?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号