В моей программе 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
}
Спасибо!
Используйте рекурсию, чтобы убедиться, что все запросы db выполняются синхронно, вот пример:
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();
Вы можете использовать async/await
7.9.0
на узле> 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
приостановит вашу функцию до тех пор, пока не будет достигнуто обещание. Он не будет блокировать основной поток.
Я не знаю, чего вы пытаетесь выполнить, но похоже, что вы пытаетесь создать свой собственный уникальный идентификатор. Я думаю, что все, что вы используете, может справиться с этим. Просто найдите время для поиска документов db/driver, которые вы используете. Попытка создать уникальный идентификатор так, как вы это делаете, кажется очень неэффективной.