如何在 node.js 中的异步和条件循环中执行嵌套查询

How to execute nested queries within async and conditional loop in node.js

我正在为我的项目使用 node.js、express 和 postgres 数据库。我在异步函数中有几个查询,我无法按顺序执行。示例代码供参考。

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 但仍然没有预期的输出。

更新:(已解决)

我没有使用嵌套查询函数,而是删除了嵌套,并准备了单个查询,以便获得预期结果并保持执行顺序。

试试这个,我刚刚将图像处理代码移到查询函数的回调中,因此它应该 运行 按顺序。

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 

你真的应该使用 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 的更多信息。