如何在Node JS中使用while循环中的条件,它具有异步查询功能,只在回调函数中修改了循环条件?

时间:2018-01-07 00:01:30

标签: javascript node.js asynchronous callback

在我的nodejs程序中,while循环具有可以通过其中的异步函数修改的条件。但是,由于函数是异步的,程序将进入无限循环。如何解决这个问题?

let unique = true
while(unique)
{
    console.log("Inside Loop")
    let id = random.generate(5)
    let u_query = "Insert into table_db (id, name) values ("+db.escape(id)+", "+db.escape(name)+")";
    db.query(u_query, (error, results, fields) => {
        console.log("Inside Query")
        if(error)
        {
            if(error.code !== 'ER_DUP_ENTRY')
                throw error
        }
        else
        {
            unique = false // to stop execution
            res.send("Shorted URL : "+newURL)
            // break is giving error
            //SyntaxError: Illegal break statement
        }
    })
    // To check if loop is stopping and asynch function is causing infinite loop
    // I used unique = false here
}

谢谢!

2 个答案:

答案 0 :(得分:1)

使用recursion确保所有数据库查询同步运行,这是一个示例:

function nextQuery() {

    let id = random.generate(5)
    let u_query = "Insert into table_db (id, name) values ("+db.escape(id)+", "+db.escape(name)+")";

    db.query(u_query, (error, results, fields) => {

        if (error) {

            if (error.code !== 'ER_DUP_ENTRY')
                throw error

            // call nextQuery()
            return nextQuery();
        }
        else {

            return res.send("Shorted URL : "+newURL) // to stop execution
        }

    })
}

nextQuery();

答案 1 :(得分:1)

您可以在节点>上使用async/await 7.9.0,就像那样:

const whatever = async () => {
    let unique = true
    while(unique)
    {
        const id = random.generate(5)
        const u_query = `Insert into table_db (id, name) values (${db.escape(id)}, ${db.escape(name)})`

        await new Promise(resolve => db.query(u_query, error => {
            if(error) {
                if(error.code !== 'ER_DUP_ENTRY') throw error
            } else {
                unique = false
                res.send('Shorted URL : ' + newURL)
            }

            resolve()
        }))
    }
}

await new Promise将暂停您的功能,直到承诺结算。它不会阻止主线程。

我不知道你想要完成什么,但似乎你正在尝试创建自己独特的id。我认为无论你使用什么数据库都可以为你处理它。只需花时间搜索您正在使用的db / driver文档。尝试以你正在做的方式生成一个唯一的id似乎非常低效。