我是节点js和续集ORM的初学者。
下面是我的代码,它有while循环。
var arr = [];
var orgParntId = 7;
do {
console.log('LOG 1');
global.meal.findOne({
where: {
id: orgParntId,
},
}).then(meal => {
orgParntId = meal.parentId;
arr.push(meal.parentId);
console.log('LOG 2');
});
console.log('LOG 3');
}
while (orgParntId < 0);
console.log('LOG 4');
有一个父子关系表,当我给出子元素Id时,它应该循环并找到所有相关的项目Id层次结构。问题是,查询最后运行。我添加了日志,执行完该功能后,会显示如下所示的日志。
LOG 1
LOG 3
LOG 4
LOG 2
最后执行查询。 我需要的是,执行上面的循环
LOG 1
LOG 2
LOG 3
LOG 1
LOG 2
LOG 3
.
.
.
LOG 4
等待执行sequelize ORM查询然后执行下一行的方法是什么?
答案 0 :(得分:1)
这是async
和await
闪耀的示例之一!
const main = async function () {
var arr = [];
var orgParntId = 7;
do {
const meal = await global.meal.findOne({
where: {
id: orgParntId,
},
})
orgParntId = meal.parentId;
arr.push(meal.parentId);
} while (orgParntId < 0); // are you sure this shouldn't be ">"?
return arr;
}
main().then(array => {
console.log(array);
});
这些查询的性质是异步的,您要做的是迭代数据并逐个查询其父级。使用async
/ await
,您可以按顺序/同步方式编写代码,并将它们包装在异步函数中。
如果您想知道JS如何处理异步函数,我建议@typ发布的链接。
答案 1 :(得分:0)
mychapter
操作是异步操作。在您致电global.meal.findOne()
之后,但在稍后(数据准备就绪时),将不会执行.then(meal)
。所以你需要处理它而不是使用do-while循环,而是以不同的方式处理它。
对于初学者,您必须了解Javascript中的异步。看看这些:
Getting to know asynchronous JavaScript: Callbacks, Promises and Async/Await Understanding JavaScript Promises, Pt. I: Background & Basics