如何等待所有嵌套异步递归函数执行完成后再执行清理操作?
解决方案
要实现所有递归异步请求并行执行,且全部完成后再执行清理操作,核心是用Promise跟踪所有异步任务,并通过Promise.all等待所有任务结束。原代码的问题在于没有跟踪异步操作的状态,导致Cleanup会直接跳过异步逻辑执行。
修改要点:
- 让递归函数返回Promise,用于跟踪当前请求及所有子请求的完成状态
- 收集所有子递归的Promise,用
Promise.all并行等待它们全部完成 - 主函数使用
async/await等待整个递归流程结束
修改后的代码:
// 递归函数返回Promise,跟踪所有异步操作 const recurse = async (url) => { console.log('Recurse: ', url); // 等待fetch请求和json解析完成 const res = await fetch(url); const data = await res.json(); db.write(data); // 收集所有子递归的Promise const childPromises = []; if ('parents' in data) { for (let parent of Object.values(data.parents)) { // 并行触发子递归,不等待单个完成 childPromises.push(recurse(parent.URL)); } } // 等待所有子请求完成后,当前递归才完成 await Promise.all(childPromises); }; const main = async () => { const dataUrl = 'http://api.familytree.example.com/me'; console.log('Start'); // 等待整个递归流程全部完成 await recurse(dataUrl); console.log('Cleanup'); }; main();
关键说明:
- 并行执行:所有子递归请求会被立即触发(推入
childPromises数组),不会等待单个请求完成再触发下一个,实现并行效果 - 全局等待:
Promise.all(childPromises)会等待当前节点的所有子请求完成,而await recurse(dataUrl)会等待整个递归树的所有请求全部完成 - 异步状态跟踪:通过
async/await和Promise链,确保整个递归流程的异步状态被正确跟踪,Cleanup只会在所有请求完成后执行
内容的提问来源于stack exchange,提问作者match
相关产品推荐
相关产品推荐

