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

如何等待循环中所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:28:07