代码之家  ›  专栏  ›  技术社区  ›  weeraa

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

  •  0
  • weeraa  · 技术社区  · 8 年前

    我是node js和sequelize 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 回复  |  直到 8 年前
        1
  •  1
  •   Aᴍɪʀ    8 年前

    这是 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);
    });
    

    这些查询的本质是异步的,您要做的是迭代您的数据并逐个查询它们的父级。使用 异步 / 等候 您可以以顺序/同步的方式编写代码,并将其封装在异步函数中。

    如果您想了解JS如何处理异步函数,我建议使用@typ发布的链接。

        2
  •  0
  •   tyb    8 年前

    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

    推荐文章