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

Node.js中如何并行下载多文件后同步执行后续代码?

Node.js并行下载文件并等待全部完成的解决方法

直接循环调用downloadFilesAsync()确实会让所有下载任务并行启动,但程序会直接往下走,不会等它们完成。而在循环里加await会变成串行执行——每次得等当前文件下载完才会启动下一个,完全发挥不了并行的优势。

解决思路很简单,用Promise.all()来统一等待所有异步任务:

步骤1:收集所有下载任务的Promise

先把每个downloadFilesAsync()调用返回的Promise都存到一个数组里,这一步不要加await,这样所有任务会立刻并行启动。

步骤2:等待所有任务完成

用Promise.all()传入这个Promise数组,它会等待数组里所有Promise都执行完成后,才会继续往下走。

完整代码示例

async function batchDownload() {
  // 收集所有下载任务的Promise
  const downloadTasks = [];
  for (let i = 0; i < 100; i++) {
    // 直接把Promise存入数组,不等待,启动并行任务
    downloadTasks.push(downloadFilesAsync());
  }

  // 等待所有下载任务完成
  await Promise.all(downloadTasks);

  // 所有下载完成后,执行后续同步代码
  continueSynchronously();
}

// 调用执行
batchDownload();

处理个别下载失败的情况

如果希望哪怕有几个文件下载失败,也继续等待其他任务完成,而不是立刻终止,可以用Promise.allSettled()替代Promise.all(),它会返回所有任务的执行结果(成功或失败):

async function batchDownload() {
  const downloadTasks = [];
  for (let i = 0; i < 100; i++) {
    downloadTasks.push(downloadFilesAsync());
  }

  // 等待所有任务完成,不管成功还是失败
  const downloadResults = await Promise.allSettled(downloadTasks);

  // 可以遍历结果,处理成功/失败的情况
  downloadResults.forEach((result, idx) => {
    if (result.status === 'fulfilled') {
      console.log(`第${idx + 1}个文件下载完成`);
    } else {
      console.error(`第${idx + 1}个文件下载失败:`, result.reason);
    }
  });

  continueSynchronously();
}

batchDownload();

注意:以上代码需要放在async函数中执行,因为用到了await语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:15:02