async函数本身不直接依赖生成器,但可与async function*异步生成器配合实现流式数据处理,支持边请求、边解析、边消费,避免一次性加载全部数据。

JavaScript 中 async 函数本身不直接依赖生成器,但可以与生成器(特别是 async function* 异步生成器)配合,实现真正的流式数据处理——比如边请求、边解析、边消费,避免一次性加载全部数据。
异步生成器是流式核心
ES2018 引入了异步生成器函数(async function*),它返回一个 AsyncIterator,支持 await 和 yield 混用。这是实现“拉取式流”的标准方式:
- 每次调用
iterator.next()返回一个Promise -
yield的值可为 Promise,自动 await;也可 yield 普通值,供消费者按需获取 - 天然支持
for await...of,语法简洁且语义清晰
用 async 生成器模拟分页 API 流
例如从分页接口持续拉取用户数据,不等全部响应完就逐条处理:
async function* fetchUsersStream(cursor = 0) {
while (true) {
const res = await fetch(`/api/users?limit=10&cursor=${cursor}`);
const { users, nextCursor } = await res.json();
<pre class="brush:php;toolbar:false;">for (const user of users) {
yield user; // 立即产出单个用户
}
if (!nextCursor) break;
cursor = nextCursor;} }
// 消费:每拿到一个 user 就处理,无需等待全部加载 for await (const user of fetchUsersStream()) { console.log('Processing:', user.name); // 可在此处做渲染、校验、写入 IndexedDB 等 }
与普通 async 函数协作做流式转换
async 函数适合封装单次异步操作,而 async 生成器负责“拆解+调度”。二者常组合使用:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用 async 函数封装耗时子任务(如图片压缩、文本分析)
- 在 async 生成器中
yield await processItem(item),保持流式节奏 - 也可用
Promise.allSettled批量并发处理几项,再 yield 结果数组,平衡吞吐与内存
注意背压与取消控制
流式不是无脑 yield。真实场景需考虑:
-
背压:消费者处理慢时,生成器应暂停拉取(例如在
for await循环内加await delay(100)控制节奏) -
取消:通过
AbortSignal传入 fetch 或监听iterator.return()实现优雅中断 -
错误传播:异步生成器中抛错会终止迭代,需 try/catch + yield 错误对象或用
throw让消费者捕获
不复杂但容易忽略:流式价值不在“炫技”,而在可控的内存占用和响应及时性——尤其面对大文件、长轮询、实时日志等场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










