如何在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
相关产品推荐
相关产品推荐

