如何等待循环中所有Promise完成解析?
如何等待循环中所有Promise完成解析?
这个问题我太懂了!你碰到的是异步代码执行顺序的典型坑——forEach 循环里的异步操作还没跑完,你就立刻打印 results 了,那肯定是空的呀。下面给你两种实用的解决思路,按需选就行:
先看看你原来的问题代码,方便对照:
async function getSomething(parameter) { ... } function myFunction() { const params = [param1, param2, ...] const results = [] let i = 0 params.forEach((param) => { getSomething(param).then((result) => results[i++] = result) }) console.log(results) // 这里异步操作还没完成,所以是空数组 }
方法一:用 Promise.all 并行等待所有Promise(推荐,效率更高)
如果你的异步操作之间没有依赖关系,优先用这个,它会让所有Promise同时执行,等全部完成后一次性拿到结果,顺序还和原参数数组保持一致。
修改后的代码:
async function getSomething(parameter) { // 这里是你的实际异步逻辑,比如接口请求 return new Promise(resolve => { setTimeout(() => resolve(`处理结果:${parameter}`), 1000); }); } async function myFunction() { const params = [param1, param2, ...]; // 先把每个参数对应的Promise收集到数组里 const promiseList = params.map(param => getSomething(param)); // 等待所有Promise都resolve,拿到完整结果数组 const results = await Promise.all(promiseList); console.log(results); // 现在就能拿到所有异步操作的结果了 } myFunction();
方法二:用 async/await + for...of 串行执行
如果你的异步操作需要按顺序执行(比如必须等前一个完成才能执行下一个),就用这种方式,它会逐个等待每个Promise完成后再继续循环。
修改后的代码:
async function getSomething(parameter) { return new Promise(resolve => { setTimeout(() => resolve(`处理结果:${parameter}`), 1000); }); } async function myFunction() { const params = [param1, param2, ...]; const results = []; // 用for...of循环替代forEach,支持await for (const param of params) { const result = await getSomething(param); results.push(result); } console.log(results); // 同样能拿到正确结果 } myFunction();
为啥原来的代码不行?
forEach 本身不支持异步等待,它会快速遍历完所有参数,不管里面的异步操作有没有完成。而且你用 i++ 赋值结果的话,还可能因为异步完成顺序不确定,导致结果顺序混乱,最后打印的时候所有异步操作都还没跑完,results 自然是空的。
备注:内容来源于stack exchange,提问作者Calim Snow
相关产品推荐
相关产品推荐

