我正在为我的项目使用node.js,express和postgres db。我在异步函数中几乎没有查询,我无法在序列中执行。示例代码供参考。
for(let i=0;i<person_size;i++)
{
var check_person_query="select per_id_pk from person_tbl where per_fname='"+person_fname[i]+"' and per_lname='"+person_lname[i]+"'";
dbClient.query(check_person_query,function(err,result){
if(result.rows.length>0)
{
console.log("Call: 1.1");
console.log("person already exists");
}
else
{
var insert_person_query = "insert into person_tbl (per_fname,per_lname,per_gender,profile_photo) values('"+person_fname[i]+"','"+person_lname[i]+"','"+person_gender[i]+"','profile_photo_link')";
//console.log("query2: "+insert_person_query);
dbClient.query(insert_person_query,function(err,result){
if (err) throw err;
console.log("Call: 1.2");
console.log("New person has been added");
});
var fullname = person_fname[i].concat(person_lname[i]);
low_fullname = fullname.toLowerCase();
person_pic[i].mv("/home/aniket/content_info/images/"+low_fullname+".jpg", function(err){
if (err) throw err;
});
}
});
}//end for
在上面的代码中,当if条件失败时,else部分在我的async.series函数的最后执行。只要条件成功,一切都按顺序完美运行。如何顺序运行嵌套的数据库查询?我使用过async.waterfall但仍然没有预期的输出。
更新:(已解决)
我没有使用嵌套查询函数,而是删除了嵌套,并准备了一个查询,以便获得预期结果并维护执行顺序。
答案 0 :(得分:0)
试试这个,我刚刚在查询函数的回调中移动了图像处理代码,所以它应该按顺序运行。
for(let i=0;i<person_size;i++)
{
var check_person_query="select per_id_pk from person_tbl where per_fname='"+person_fname[i]+"' and per_lname='"+person_lname[i]+"'";
dbClient.query(check_person_query,function(err,result){
if(result.rows.length>0)
{
console.log("Call: 1.1");
console.log("person already exists");
}
else
{
var insert_person_query = "insert into person_tbl (per_fname,per_lname,per_gender,profile_photo) values('"+person_fname[i]+"','"+person_lname[i]+"','"+person_gender[i]+"','profile_photo_link')";
//console.log("query2: "+insert_person_query);
dbClient.query(insert_person_query,function(err,result){
if (err) throw err;
console.log("Call: 1.2");
console.log("New person has been added");
var fullname = person_fname[i].concat(person_lname[i]);
low_fullname = fullname.toLowerCase();
person_pic[i].mv("/home/aniket/content_info/images/"+low_fullname+".jpg", function(err){
if (err) throw err;
});
});
}
});
}//end for
答案 1 :(得分:0)
您实际上应该只使用async / await。 pg lib supports promises,因此您可以执行以下操作:
for(let i=0;i<person_size;i++) {
const result = await dbClient.query(check_person_query);
if(result.rows.length <= 0) {
await dbClient.query(insert_person_query);
}
}
有关using for loops with async/await的更多信息。