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

如何等待所有嵌套异步递归函数执行完成后再执行清理操作?

解决方案

要实现所有递归异步请求并行执行,且全部完成后再执行清理操作,核心是用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();

关键说明:

  1. 并行执行:所有子递归请求会被立即触发(推入childPromises数组),不会等待单个请求完成再触发下一个,实现并行效果
  2. 全局等待:Promise.all(childPromises)会等待当前节点的所有子请求完成,而await recurse(dataUrl)会等待整个递归树的所有请求全部完成
  3. 异步状态跟踪:通过async/await和Promise链,确保整个递归流程的异步状态被正确跟踪,Cleanup只会在所有请求完成后执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:35:14