JavaScript迭代器模式实战:构建可中断的数据管道系统
一、迭代器模式核心优势
传统数据处理方式的痛点与迭代器解决方案:
- 惰性求值:按需处理大数据集
- 可组合性:管道式数据处理
- 异步友好:支持异步数据源
- 内存高效:避免中间数组分配
二、电商数据分析案例
1. 基础数据管道实现
function* createDataPipeline(source) {
// 数据清洗阶段
yield* filterInvalidRecords(source);
// 数据转换阶段
yield* transformCurrency(yield*);
// 数据分析阶段
yield* calculateStatistics(yield*);
}
function* filterInvalidRecords(source) {
for (const item of source) {
if (item.price > 0 && item.quantity > 0) {
yield item;
}
}
}
function* transformCurrency(source) {
const exchangeRate = 6.5; // USD to CNY
for (const item of source) {
yield {
...item,
localPrice: item.price * exchangeRate,
currency: 'CNY'
};
}
}
2. 可中断处理机制
class PipelineController {
constructor(pipeline) {
this.iterator = pipeline;
this.isAborted = false;
}
process(limit = Infinity) {
const results = [];
let count = 0;
for (const item of this.iterator) {
if (this.isAborted) break;
if (++count > limit) break;
results.push(item);
}
return results;
}
abort() {
this.isAborted = true;
}
}
// 使用示例
const controller = new PipelineController(
createDataPipeline(getSalesData())
);
const result = controller.process(1000); // 只处理1000条
3. 异步数据源支持
async function* asyncDataPipeline(source) {
for await (const chunk of source) {
yield* processChunk(chunk);
}
}
async function processChunk(chunk) {
// 模拟异步转换
const processed = await Promise.all(
chunk.map(async item => ({
...item,
discount: await calculateDiscount(item)
}))
);
yield* processed;
}
三、高级应用技巧
1. 管道组合器
function composePipelines(...pipelines) {
return function* (source) {
let current = source;
for (const pipeline of pipelines) {
current = pipeline(current);
}
yield* current;
};
}
// 创建组合管道
const fullPipeline = composePipelines(
filterInvalidRecords,
transformCurrency,
calculateStatistics
);
2. 性能监控装饰器
function withMetrics(pipeline) {
return function* (source) {
const start = performance.now();
let count = 0;
for (const item of pipeline(source)) {
count++;
yield item;
}
console.log(`处理 ${count} 条数据,耗时 ${performance.now() - start}ms`);
};
}
四、实际应用场景
- 大数据分块处理:GB级JSON文件流式处理
- 实时数据分析:WebSocket数据流处理
- 复杂ETL流程:多阶段数据转换
- UI数据渲染:分帧渲染避免界面卡顿

