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

