generator 处理复杂数据管道的核心在于“分步定义 + 惰性执行 + 组合封装”,通过单一职责的可暂停迭代器实现按需计算、内存恒定、链式组合、异步融合及可控错误处理。

Generator 处理复杂数据管道的核心在于“分步定义 + 惰性执行 + 组合封装”——它不直接操作数据,而是把每一步处理逻辑声明为可暂停、可传递、可复用的迭代器,让数据在消费时才逐段流动和转化。
用单一职责 Generator 封装基础操作
每个 Generator 函数只做一件事:map、filter、take、flatMap 或自定义转换。它们接收一个可迭代源(数组、生成器、Set 等),产出新迭代器,内部不预计算、不缓存全量结果。
-
filter:遍历源,只对满足条件的值调用
yield -
map:对每个值应用转换函数后
yield新值 -
take:计数器到上限即
return,终止后续产出 -
throttle 或 batch:累积 N 个值再
yield数组,适合分批提交
链式组合构建清晰管道
Generator 返回的是迭代器对象,天然支持嵌套调用。组合时保持顺序直观,且内存恒定——上层没消费,下层不执行。
- 写法示例:
take(filter(map(users, u => u.name.toUpperCase()), n => n.length > 3), 10) - 等价于传统链式调用,但无中间数组生成,避免
users.map(...).filter(...).slice(...)的三次遍历与内存拷贝 - 可提前中断:消费者只取前 5 个,
take内部 return 后,map和filter自动停止推进
接入异步与外部流(如 API、文件)
同步 Generator 无法 await,但 async generator(async function*)可自然融合异步源,保持管道风格。
- 逐页拉取用户数据:
async function* fetchAllUsers() { for (let page = 1; ; page++) { const res = await fetch(`/api/users?page=${page}`); const list = await res.json(); if (!list.length) break; yield* list; } } - 再套过滤:
filter(fetchAllUsers(), u => u.active),仍保持按需请求、按需过滤 - 配合
for await...of消费,语法与同步管道一致
错误与边界控制更可控
Generator 中可使用 try/catch 包裹 yield 行为,也可用 generator.throw() 外部注入错误,便于统一拦截或降级。
- 某步解析失败?
yield一个错误对象,由上层决定跳过、重试或终止管道 - 网络超时?在 async generator 中
await Promise.race([fetch(), timeout(5000)]),失败时 throw,触发外部错误处理流 - 数据格式异常?
map内部校验,非法值continue跳过,不中断整个流程
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











