You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:52:36