【问题标题】:Nodejs Sequelize recursive async/awaitNodejs Sequelize递归异步/等待
【发布时间】:2021-02-11 20:38:13
【问题描述】:

我正在为递归循环和嵌套的创建/选择语句而苦苦挣扎。我从具有以下结构的发布请求中接收到一个对象:

 11.6042
 ---11.6042_01
 ---11.6042_02
 ---11.6042_02
 ---14x10-100
 ------14x10-100_01
 ---14x10-100
 ------14x10-100_01
 ---14x10-100
 ------14x10-100_01
 ---M10-DIN929_14020
 ---M10-DIN929_14020
 ---11.6042_05

想要的行为:遍历结构递归,将记录添加到零件表,与父零件自联接,与 PartLib 表联接,如果不存在匹配项,则创建 PartLib 记录并匹配创建的记录。处理下一部分。

问题:14x10-100 部分在结构中出现了 3 次。我想在 part_lib 表中为部分 14x10-100 创建一条记录,并引用该记录三次。实际发生的是,对于每个 14x10-100 部分,在 part_lib 表中创建一个相应的记录,而不是一个创建和两个匹配。如果我再次运行它,它将像预期的那样匹配。我怀疑我迷失在代码的承诺/异步等待部分中。

在相关代码下方。为了便于阅读,我删除了一些属性映射。我背后的想法:我不会像往常一样在异步函数中返回新的承诺,因为 Sequelize 已经返回了一个承诺。在创建我正在等待(或至少我认为如此)的部分时,partLibController 调用以确保在继续进行结构中的下一个部分之前完成所有匹配/创建/加入。

非常感谢!!

递归循环

function parseChild(child, modelId, parentId, userId, level) {
    return new Promise((resolve, reject) => {
        partController.create({
            parent_id: parentId
            , name: child.name
        }, { id: userId }).then((part) => {
            resolve({ child: child, level: level });
            
            if (child.children) {
                child.children.forEach(grandChild => {
                    parseChild(grandChild, modelId, part.part_id, userId, level + '---');
                });
            }
        }).catch(error => { console.log(error); });
    }).then((obj) => { console.log(`${obj.level} ${obj.child.name}`); });
}

PartController 创建

async function create(partBody, currentUser) {
    let { parent_id, name } = partBody;
    
    const match = await partLibController.match(name);
    let partLibId = null;

    if (match.length == 0) {
        const partLib = await partLibController.createFromPart(partBody, currentUser);
        partLibId = partLib.part_lib_id;
    } else {
        partLibId = match[0].dataValues.part_lib_id
    }

    return ModelAssembly.create({
        parent_id: parent_id
        , name: name
        , part_lib_id: partLibId
    });
}

PartLibController 匹配

function match(name) {
    return PartLib.findAll({
        where: {
            name: name
        },
    });
}

PartLibController CreateFromPart

function createFromPart(partBody, currentUser) {
    let { name } = partBody;
    
    return PartLib.create({
        name,
    });
}

【问题讨论】:

    标签: asynchronous recursion async-await promise sequelize.js


    【解决方案1】:

    感谢 AKX,我已经解决了这个问题:hero

    我想问题出在递归调用本身,但这是工作代码:

    async function parseChild(child, modelId, parentId, userId, level) {
        const body = {
            parent_id: parentId
            , name: child.name
        };
        const ma = await partController.create(body, { id: userId });
    
        if (child.children) {
            for (const grandChild of child.children) {
                await parseChild(grandChild, modelId, ma.part_id, userId, level + '---');
            }
        }
    
        return;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-28
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-12
      • 2019-07-20
      • 2015-08-27
      • 2022-01-14
      相关资源
      最近更新 更多