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

问题描述 投票:0回答:2

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

node.js sequelize.js
2个回答
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发布的链接。


0
投票

global.meal.findOne()操作是一个异步操作。 .then(meal)将在您调用.findOne()后立即执行,但稍后(数据准备就绪时)执行。所以你需要处理它而不是使用do-while循环,而是以不同的方式处理它。

对于初学者,您必须了解Javascript中的异步。看看这些:

Getting to know asynchronous JavaScript: Callbacks, Promises and Async/Await Understanding JavaScript Promises, Pt. I: Background & Basics

© www.soinside.com 2019 - 2024. All rights reserved.