Node.js(TypeScript)中如何启动多进程并等待全部完成?
在Node.js中启动多进程并等待全部完成的实现
无论是纯Node.js(JavaScript)环境还是TypeScript环境,核心思路都是将每个spawn启动的进程包装为Promise,再通过Promise.all等待所有进程执行完成,之后再触发后续逻辑。以下是具体实现方案:
一、纯Node.js(JavaScript)环境实现
核心步骤
- 封装
spawn进程为Promise,监听进程的close和error事件 - 收集所有需要启动的进程Promise,用
Promise.all等待全部完成 - 处理成功/失败的分支,执行后续操作或捕获错误
示例代码
const { spawn } = require('child_process'); // 封装单个spawn进程为Promise function runSpawnProcess(cmd, args) { return new Promise((resolve, reject) => { const process = spawn(cmd, args, { stdio: 'inherit' }); // 继承父进程输出,便于查看日志 process.on('close', (code) => { code === 0 ? resolve() : reject(new Error(`进程 ${cmd} 退出码: ${code}`)); }); process.on('error', (err) => { reject(new Error(`进程启动失败: ${err.message}`)); }); }); } // 批量启动并等待所有进程完成 async function runAllProcesses() { try { // 定义要执行的多个进程任务 const processTasks = [ runSpawnProcess('npm', ['run', 'build:admin']), runSpawnProcess('npm', ['run', 'build:client']), runSpawnProcess('node', ['./scripts/cleanup.js']) ]; // 等待所有进程执行完成 await Promise.all(processTasks); // 所有进程完成后执行后续逻辑 console.log('所有进程执行完成,开始后续操作'); // 这里可以添加后续命令,比如启动服务、打包压缩等 } catch (err) { console.error('进程执行出错:', err.message); process.exit(1); // 出错时终止父进程 } } runAllProcesses();
二、TypeScript环境实现
TypeScript环境下的逻辑与JavaScript一致,仅需添加类型注解以符合TS语法规范,同时确保相关依赖已安装(typescript、@types/node)。
示例代码
import { spawn, ChildProcess } from 'child_process'; // 带类型注解的进程封装函数 function runSpawnProcess(cmd: string, args: string[]): Promise<void> { return new Promise((resolve, reject) => { const process: ChildProcess = spawn(cmd, args, { stdio: 'inherit' }); process.on('close', (code: number | null) => { if (code === 0) { resolve(); } else { reject(new Error(`进程 ${cmd} 退出码: ${code ?? '未知'}`)); } }); process.on('error', (err: Error) => { reject(new Error(`进程启动失败: ${err.message}`)); }); }); } // 批量执行进程的异步函数 async function runAllProcesses(): Promise<void> { try { const processTasks = [ runSpawnProcess('tsc', ['--project', './tsconfig.admin.json']), runSpawnProcess('tsc', ['--project', './tsconfig.client.json']), runSpawnProcess('node', ['./dist/scripts/cleanup.js']) ]; await Promise.all(processTasks); console.log('所有进程执行完成,开始后续操作'); // 后续逻辑示例:启动编译后的Node服务 // await runSpawnProcess('node', ['./dist/server.js']); } catch (err) { console.error('进程执行出错:', (err as Error).message); process.exit(1); } } runAllProcesses();
注意事项
- 若直接用
ts-node运行脚本,需提前安装ts-node依赖 stdio: 'inherit'配置可让子进程的输出直接同步到父进程控制台,如需自定义输出处理可改为'pipe'并监听stdout/stderr事件Promise.all会并行执行所有进程,若需串行执行可改用循环逐个await
内容的提问来源于stack exchange,提问作者carlo.milanesi
相关产品推荐
相关产品推荐

