停止执行直到响应在节点js中返回

时间:2018-03-04 07:47:22

标签: node.js sequelize.js

我是节点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查询然后执行下一行的方法是什么?

2 个答案:

答案 0 :(得分:1)

这是asyncawait闪耀的示例之一!

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