首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同步+异步POSTing嵌套父-子对象以保持顺序

同步+异步POSTing嵌套父-子对象以保持顺序
EN

Stack Overflow用户
提问于 2021-10-16 21:37:00
回答 1查看 79关注 0票数 0

我有一个嵌套的Person对象数组。

每个Person对象都有一个强制的name。每个Person也可以有一个children字段,该字段包含一个其他Person对象的数组(其中也有一个子字段--因此家族树的“深度”基本上可以永远保持下去)。

如果没有子字段,子字段将只是一个空数组[]。

例如。

代码语言:javascript
复制
  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_idfamily_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。

编辑:下面是一些伪代码:

代码语言:javascript
复制
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)
代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-16 22:21:09

与对顺序循环使用async/await不同,我建议使用同步循环并分别累加两件事情:

对子程序的承诺(请参阅对所有递归调用的there)

  • an或here数组,最终将是Promise.alld)。

这确保了正确的顺序以及错误的立即传播。

所以代码看起来就像

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69599729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档