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

未知深度嵌套Person家谱对象异步递归POST上传实现方案咨询

是否需要递归实现?

是,因为你的家谱数据是任意深度嵌套的树形结构,递归逻辑可以天然匹配这种层级遍历的需求,代码可读性更高,也能更好的满足「父级先传、同级并行」的要求。当然你也可以用广度优先迭代的方式实现,但递归的写法更简洁易维护。

具体实现代码

这里用async/await语法实现,逻辑更清晰:

import axios from 'axios'
// 替换为你实际的业务接口地址
const FAMILY_UPLOAD_API = '/api/create-family'
const PERSON_UPLOAD_API = '/api/create-person'

/**
 * 递归上传指定层级的所有Person节点及其后代
 * @param {Array} currentLevelPersons 当前层级的Person对象数组
 * @param {String|Number} parentId 当前层级所有节点的父级ID
 */
async function uploadLevelPersons(currentLevelPersons, parentId) {
  // 1. 并行提交当前层级所有同级节点,符合规则3
  const uploadedNodes = await Promise.all(
    currentLevelPersons.map(async (person) => {
      const res = await axios.post(PERSON_UPLOAD_API, {
        name: person.name,
        parent_id: parentId
      })
      // 记录当前节点返回的ID和对应的子节点,用于后续递归
      return {
        selfId: res.data.id,
        children: person.children ?? []
      }
    })
  )

  // 2. 依次处理每个已上传节点的子节点,父级先传再传子级,符合规则2
  for (const node of uploadedNodes) {
    if (node.children.length > 0) {
      await uploadLevelPersons(node.children, node.selfId)
    }
  }
}

/**
 * 家谱上传主入口
 * @param {String} familyName 家族名称
 * @param {Array} familyTree 家谱根层级Person数组
 */
async function uploadFullFamily(familyName, familyTree) {
  // 优先提交家族名称获取根父级ID,符合规则1
  const familyRes = await axios.post(FAMILY_UPLOAD_API, {
    family_name: familyName
  })
  const rootParentId = familyRes.data.family_id
  // 从根层级开始递归上传所有节点
  await uploadLevelPersons(familyTree, rootParentId)
  console.log('全量家谱数据上传完成')
}

// 调用示例
const family_name = "The Numbers";
const family = [
  {
    name: "1",
    children: [],
  },
  {
    name: "2",
    children: [
      {
        name: "2 - 1",
        children: [],
      },
      {
        name: "2 - 2",
        children: [
          {
            name: "2 - 2 - 1",
            children: [],
          },
        ],
      }
    ],
  },
  {
    name: "3",
    children: [
      {
        name: "3 - 1",
        children: [],
      },
    ],
  },
]

// 执行上传,可自行添加错误处理逻辑
uploadFullFamily(family_name, family).catch(err => {
  console.error('上传过程出错:', err)
})

逻辑说明

  • 完全符合上传规则:先提交家族名称获取根ID,父节点全部上传完成后才会提交子节点,所有同级节点并行提交
  • 支持任意深度的嵌套结构,不管嵌套多少层都能正常遍历上传
  • 如果需要添加失败重试、上传进度统计等能力,可在现有代码基础上扩展即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:57:04