如何批量等待Axios Promise请求执行完成,无需硬编码调用
问题根源
Array.prototype.forEach本身没有异步等待的逻辑,你传入的async回调返回的Promise会被forEach直接忽略,不会等待执行完成,所以代码会在所有请求返回前就执行console.log(array),此时数组还没被推入数据。你硬编码的写法每一步都手动await了请求,所以会等所有请求执行完成后才执行打印,能拿到完整数据。
解决方案
方案1:串行请求(和硬编码逻辑完全一致,推荐898次请求的场景使用,不会触发服务端限流)
用支持await的for...of循环替代forEach即可,不需要用到yield语法:
async function main() { for (const item of someArrayWithALotOfObjects) { await A(item.url); } // 所有请求已执行完成,可在此处执行文件写入逻辑 console.log(array); // 示例写文件逻辑:await fs.promises.writeFile('./output.json', JSON.stringify(array)) }
方案2:并行请求(请求速度更快,适合服务端允许高并发的场景)
用Array.prototype.map生成所有请求的Promise数组,再通过Promise.all等待所有请求完成,同样不需要用到yield语法:
async function main() { // 生成所有请求的Promise实例 const allRequests = someArrayWithALotOfObjects.map(item => A(item.url)); // 等待全部请求执行完成 await Promise.all(allRequests); // 所有请求已执行完成,可在此处执行文件写入逻辑 console.log(array); }
注意事项
- 898次请求如果用并行方案,可能触发服务端的请求频率限制,建议优先用串行方案,稳定性更高。
- 后续替换为fs写文件操作时,建议使用
fs.promises下的异步API,和现有async/await写法适配性更好,避免回调嵌套。
内容的提问来源于stack exchange,提问作者adarian
相关产品推荐
相关产品推荐

