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

如何在JavaScript循环中使用Promise.all批量加速API调用?

当然可以用Promise.all实现并行调用,大幅提升效率

你的代码目前是串行执行所有API调用:每次await都会阻塞后续循环,必须等当前API返回结果才会处理下一个请求,这是耗时久的核心原因。用Promise.all把所有需要执行的API请求收集成Promise数组,就能让它们并行发起,同时等待所有结果返回,效率会显著提升。

改造方案1:单Term内并行API调用(保持Term处理顺序)

如果需要保留原代码中Term的处理顺序,只把每个Term内部的API调用改成并行:

let terms = [];
this.selectedGroup.groups = ['A', 'B', 'C', 'D', 'E', 'F'];

// 按顺序处理每个Term
for (let term of this.terms) {
  // 收集当前Term下所有符合条件的API请求Promise
  const subjectPromises = [];
  for (let assessment of term.assessments) {
    for (let assessmentGroup of assessment.year_groups) {
      if (this.selectedGroup.groups.includes(assessmentGroup.name)) {
        // 直接存入Promise,不立即await
        subjectPromises.push(
          this.dataService.getData(assessment, assessmentGroup, this.selectedGroup.students)
        );
      }
    }
  }

  // 并行执行所有API请求,等待全部完成
  const subjectResults = await Promise.all(subjectPromises);
  // 合并所有返回的subject数组
  const subjects = [].concat(...subjectResults);

  terms.push({
    name: term._id,
    subjects: subjects,
  });
}

改造方案2:全并行(Term+API都并行,效率最高)

如果业务上不需要保证Term的处理顺序,还可以把所有Term的处理也改成并行,进一步提升效率:

this.selectedGroup.groups = ['A', 'B', 'C', 'D', 'E', 'F'];

// 把每个Term的处理包装成Promise
const termPromises = this.terms.map(async (term) => {
  const subjectPromises = [];
  for (let assessment of term.assessments) {
    for (let assessmentGroup of assessment.year_groups) {
      if (this.selectedGroup.groups.includes(assessmentGroup.name)) {
        subjectPromises.push(
          this.dataService.getData(assessment, assessmentGroup, this.selectedGroup.students)
        );
      }
    }
  }

  const subjectResults = await Promise.all(subjectPromises);
  const subjects = [].concat(...subjectResults);
  
  return {
    name: term._id,
    subjects: subjects,
  };
});

// 并行处理所有Term,直接得到最终的terms数组
const terms = await Promise.all(termPromises);

注意事项

  • 并发限制:如果后端对单IP的并发请求数有限制,大量并行请求可能触发限流或报错。这种情况可以考虑分批执行(比如每次并行10个请求),或者使用Promise.allSettled替代Promise.all(某个请求失败时不中断其他请求,后续可以单独处理失败的情况)。
  • 结果合并:Promise.all返回的是按Promise数组顺序排列的结果数组,用[].concat(...subjectResults)可以把多个子数组合并成一个大数组,和原代码的concat逻辑一致;如果你的环境支持ES2019+,也可以用subjectResults.flat()简化合并。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 09:55:23