如何在Node.js中实现函数数组顺序链式执行的批处理功能
在Node.js中实现混合同步/异步函数的批处理串联
嘿,我来帮你搞定这个批处理函数的串联问题!核心是要处理同步普通函数和异步Promise函数的混合数组,让它们按顺序执行,前一个函数的输出自动作为下一个的输入。下面是具体的实现思路和完整代码:
实现思路
我们可以利用Array.prototype.reduce来构建Promise链:
- 对于同步函数:直接调用并把返回值包装成Promise,保证统一的异步处理逻辑
- 对于异步Promise函数:直接使用它的返回结果
- 用reduce逐步累积执行,每一步都把当前数据传递给下一个函数
完整补全代码
'use strict'; const fs = require('fs'); // 先定义示例中的各个函数(匹配预期输出逻辑) function fun1(input) { console.log({ z: input }); return input; // 返回值作为下一个函数的输入 } function promiseFunc2(input) { return new Promise((resolve) => { setTimeout(() => { console.log({ a: input }); resolve(input); }, 100); }); } function fun3(input) { console.log({ c: input }); return input; } // 补全Process构造函数 function Process() { this.arrCallback = []; // 向批处理队列添加函数,支持链式调用 this.add = function (fn) { this.arrCallback.push(fn); return this; }; // 执行批处理,传入初始数据 this.run = function (initialData) { // 用reduce串联所有函数,构建Promise执行链 return this.arrCallback.reduce((prevPromise, currentFn) => { return prevPromise.then((data) => { // 执行当前函数,兼容同步/异步返回值 const result = currentFn(data); // 统一包装为Promise,确保链式调用的一致性 return Promise.resolve(result); }); }, Promise.resolve(initialData)); // 初始Promise,传入启动数据 }; } // 实现main函数,模拟成功/失败场景 function main(type) { const processor = new Process(); if (type === 1) { // 成功场景:添加正常执行的函数队列 processor.add(fun1).add(promiseFunc2).add(fun3); } else { // 失败场景:插入一个抛出错误的函数 processor.add(fun1).add(() => { throw new Error('执行失败') }).add(fun3); } // 执行批处理并处理结果/错误 processor.run(1) .then((finalResult) => { console.log('批处理完成,最终结果:', finalResult); }) .catch((err) => { console.error('批处理出错:', err.message); }); } main(1); // 执行成功,输出: {z: 1} {a: 1} {c: 1} 批处理完成,最终结果: 1 main(2); // 执行失败,输出: {z: 1} 批处理出错: 执行失败
代码说明
- Process构造函数:
add方法:用于向队列中添加要执行的函数,支持链式调用写法run方法:核心执行逻辑,通过reduce把队列中的函数串联成Promise链,确保前一个函数执行完成后再触发下一个
- 同步/异步兼容:通过
Promise.resolve(result)统一处理返回值,不管当前函数是同步返回普通值还是异步返回Promise,都能被链式调用正确处理 - 错误捕获:整个执行链的错误会被最终的catch捕获,方便统一处理失败场景
内容的提问来源于stack exchange,提问作者Karthik Balaji
相关产品推荐
相关产品推荐

