我有一个嵌套的Person对象数组。
每个Person对象都有一个强制的name。每个Person也可以有一个children字段,该字段包含一个其他Person对象的数组(其中也有一个子字段--因此家族树的“深度”基本上可以永远保持下去)。
如果没有子字段,子字段将只是一个空数组[]。
例如。
const family_name = "The Numbers";
const family = [{
name: "1",
children: [],
},
{
name: "2",
children: [{
name: "2-1",
children: [{
name: "2-1-1",
children: [],
}, ],
},
{
name: "2-2",
children: [],
}
],
},
{
name: "3",
children: [{
name: "3-1",
children: [],
}, ],
},
]我需要在“孩子”之前贴上“家长”。当我发布一个Person时,它的id会返回到response.data中。需要将此id作为parent_id在直接子节点的帖子中使用,以便将子对象与父级相关联。
最上面的Person需要他们的parent_id是family_name。
每个“级别”都需要异步地为POSTed,因为后端需要保留顺序。(注意:计算客户端Person的顺序并将该值传递给后端并不是一个解决方案,因为Person实际上是一个MPTT模型,其中插入顺序很重要)。
例如:1然后是2然后是3
例如,2然后是2-1,然后是2-2。
但是,嵌套的Person**s可以是同步的POSTed。**例如,一旦POSTing 2返回一个201个响应,它的“兄弟”3和它的“子”2-1可以同时是POSTed。
如何在嵌套数组中最优地发布所有Person,从而保留顺序?请注意,我使用的是axios。
编辑:下面是一些伪代码:
function postPersons(persons, parent_id) {
// Async POST all objects in persons
// e.g. POST 1 then 2 then 3 to family_name
// For each successful POST, if person has children,
// async POST those children to that person
// e.g. Once POST to 2 resolves, POST 2-1 then 2-2 to 2
// e.g. Once POST to 3 resolves, POST 3-1 to 3
// Repeat for all successful POSTs
// e.g. Once POST to 2-1 resolves, POST 2-1-1 to 2-1
}
postPersons(family, family_name)发布于 2021-10-16 22:21:09
与对顺序循环使用async/await不同,我建议使用同步循环并分别累加两件事情:
对子程序的承诺(请参阅对所有递归调用的there)
Promise.alld)。这确保了正确的顺序以及错误的立即传播。
所以代码看起来就像
function postPersons(persons, parent_id) {
const results = [];
let chain = Promise.resolve();
for (const person of persons) {
chain = chain.then(() =>
postSinglePerson(person, parent_id)
);
results.push(chain.then(result =>
postPersons(person.children, result.id)
));
}
return Promise.all(results);
}
postPersons(family, family_name).then(() => console.log('Done'), console.error);https://stackoverflow.com/questions/69599729
复制相似问题