异步生成器通过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; }}// 使用 for await...of 遍历for await (const user of fetchUsers()) {console.log(user.name);}
异步迭代器协议详解
一个异步迭代器需实现 next() 方法,该方法返回一个 Promise,Promise 的结果是 { value, done } 结构。
立即学习“Java免费学习笔记(深入)”;
智谱AI开放平台
智谱AI大模型开放平台-新一代国产自主通用AI开放平台
85 查看详情
value 是当前产出的值done 表示是否已结束(true 表示结束)异步生成器自动实现了这个协议
手动实现一个异步迭代器虽然可行,但使用异步生成器更简洁:
async function* countdown(from) { for (let i = from; i > 0; i--) { await new Promise(resolve => setTimeout(resolve, 1000)); yield i; }}for await (const tick of countdown(3)) {console.log(tick); // 每秒输出 3, 2, 1}
实际应用场景
这种组合特别适合处理分页数据、事件流或需要延迟处理的队列任务。
读取大型日志文件时,按块异步加载并处理从 WebSocket 或 SSE 流中持续接收消息实现带背压的数据管道
例如,处理分页 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++; }}for await (const item of paginatedAPI('/logs')) {console.log(item);}
基本上就这些。异步生成器简化了异步序列的构建和消费,配合 for await...of 能写出清晰且高效的流式代码。不复杂但容易忽略的是,每个 yield 的值会被自动 Promise 化,无需手动包装。
以上就是JavaScript中的异步迭代器与生成器如何结合使用?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/737162.html
微信扫一扫
支付宝扫一扫