在我的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
}
谢谢!
答案 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似乎非常低效。