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数据渲染:分帧渲染避免界面卡顿