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

Node.js Cronjob场景下所有Promise执行完毕后如何正确退出进程

问题根因

你当前代码提前退出的核心原因是:嵌套在.then()回调里的promises.push(...)是异步执行的,当代码同步执行到if (promises.length > 0)判断时,所有内层的异步回调还没触发,promises数组为空,程序直接跳过等待逻辑执行了process.exit(0),导致大量异步任务未完成就被终止。

优化方案(保留最大并行效率)

只需要把所有异步操作的Promise全部向上层返回,统一收集等待即可,不会引入串行开销,完全匹配你处理60万条记录的性能要求。

优化后代码

// 获取客户数据
const cus_recs = await db.get_customers();

// 并行获取所有客户的匹配规则
const criteria_recs = await Promise.all(
  cus_recs.map(cus_rec => db.get_criteria(cus_rec))
);

// 全量并行执行所有后续匹配、写入任务,不同任务间无串行等待
const allTasks = cus_recs.flatMap((cus_rec, index) => {
  const cus_criteria_recs = criteria_recs[index];
  return cus_criteria_recs.flatMap(async cus_criteria_rec => {
    // 单个规则下的依赖步骤按顺序执行,不影响全局并行度
    const lis_match_data = await ci.build_lis_match_data(cus_criteria_rec);
    const lis_recs = await lis.get_matching_listings(cus_criteria_rec, lis_match_data);
    // 并行处理当前规则下的所有匹配房源
    return Promise.all(
      lis_recs.map(async lis_rec => {
        await ci.build_lis_match_table(cus_criteria_rec, lis_rec);
        return lis.do_the_thing(cus_rec, lis_rec);
      })
    );
  });
});

// 等待100%任务执行完成后再退出
await Promise.all(allTasks);
process.exit(0);

方案说明

  • 所有客户、规则、房源维度的任务全部并行发起,仅单个任务内部的依赖步骤用await按顺序执行,和你原设计的并行效率完全一致,无性能损耗
  • 用flatMap合并多层Promise数组,避免冗余的数组清空操作,所有任务都能被Promise.all追踪到,不会出现遗漏
  • 如果担心并发量过高压垮数据库,可额外引入并发限制逻辑,按需控制同时执行的任务数量

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:12:03