未知深度嵌套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
相关产品推荐
相关产品推荐

