Nodejs序列化递归async/await



我正在与递归循环和嵌套的创建/选择语句作斗争。我从post请求中收到一个对象,结构如下:

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

期望行为:遍历递归结构,向Part表添加记录,自连接父部分,与PartLib表连接,如果没有匹配,则创建PartLib记录并匹配已创建的记录。处理下一部分

问题:14x10-100部分在结构中出现了三次。我想在part_lib表中为part 14x10-100创建一条记录,并引用该记录三次。实际情况是,对于每个14x10-100零件,在part_lib表中创建一个相应的记录,而不是一个创建和两个匹配。如果我再运行一次,它会像预期的那样匹配。我怀疑我在代码的promise/async await部分迷路了。

在相关代码下面。为了可读性,我删除了一些属性映射。我的想法是:我不会像在异步函数中那样返回新的承诺,因为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,
});
}

感谢AKX我已经解决了这个问题:英雄

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

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;
}

最新更新