Javascript 在for循环中调用函数,异步问题

Javascript 在for循环中调用函数,异步问题,javascript,node.js,Javascript,Node.js,我试图在我的文件表中插入一行,但当我尝试这样做时,事情的完成顺序并不是我想要的。我知道JS是异步的,但我不确定这会如何影响我在循环中的工作方式 在某种背景下,sharedLib.serverCreateCalendarfile只接受一个.ics文件,并将其内容转换为JSON,这样我就可以从中获取信息 我对JS或SQL没有太多经验,所以我不知道该怎么做才能解决这个问题 for (var i = 0; i < files; i++) { cals = sharedLib.serverCre

我试图在我的文件表中插入一行,但当我尝试这样做时,事情的完成顺序并不是我想要的。我知道JS是异步的,但我不确定这会如何影响我在循环中的工作方式

在某种背景下,sharedLib.serverCreateCalendarfile只接受一个.ics文件,并将其内容转换为JSON,这样我就可以从中获取信息

我对JS或SQL没有太多经验,所以我不知道该怎么做才能解决这个问题

for (var i = 0; i < files; i++) {
  cals = sharedLib.serverCreateCalendar(file); // get the cal info as a JSON

  var obj, fileN, version, prodID, evtNum; //variables for parsing the JSON and getting the values
  var obj = JSON.parse(cals); //parse the calendar JSON

  //Assign the values i want
  fileN = files[j];
  version = obj.version;
  prodID = obj.prodID;
  evtNum = obj.numEvents;

  //SQL to insert into the FILE table
  var calInsert = ("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); //This is the SQL to insert into the FILE table with its required info
  console.log(calInsert);

  //Send the SQL query to add a file
  connection.query(calInsert, function(err, result) {
    if (err) { //error inserting into the DB
      console.log("Calendar insert error");
      res.send("Error");
    } else { //if placing the calendar is good then add the events 
      console.log("Added the calendar!");
    }
  });

}
等等,直到我完成循环,但它输出这个

("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); 
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); 
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); 
Added the calendar!
Added the calendar!
Added the calendar!

在您的示例中,文件正在插入,但每个循环迭代都没有等待文件插入。如果希望控制台日志看起来像您描述的那样,则需要在回拨后插入下一个文件。您可以通过完全删除for循环来实现这一点:

var files=[];//如何获取文件数组 函数insertfiles文件{ //处理结束条件 如果theFiles==未定义| | theFiles.length==0{ 回来 } var cals=sharedLib.serverCreateCalendarfile;//以JSON格式获取cal信息 var obj=JSON.parsecals;//解析日历JSON var fileN=theFiles.shift;//获取第一个文件并从数组中删除 var版本=obj.version; var prodID=obj.prodID; var evtNum=obj.numEvents; //要插入到文件表中的SQL var calInsert=INSERT-INTO-FILE文件名、版本、产品id值“+fileN+”、+version+、“+prodID++”;//这是要插入到文件表中的SQL及其所需信息 console.logcalInsert; //发送SQL查询以添加文件 connection.querycalInsert、functionerr、result{ 如果错误{//插入数据库时出错 console.logCalendar插入错误; res.sendError; }否则{//如果放置日历很好,则添加事件 console.log添加了日历!; 插入文件; } }; } 插入文件;
但是,当然,正如注释中所指出的,SQL插入命令可能会以这种方式编写。

这是一个封闭网络上的作业。这是我第一次使用SQL,显然它不会很好。如果您不想攻击,那就太好了。查询都是按照您的意愿执行的,只是输出让人困惑。如果您真的想按顺序而不是并行执行查询,请参阅。这是关于浏览器中的AJAX调用,但对于任何迭代的异步操作,原理都是一样的。@Barmar哦,好的!当我现在看桌子的时候,我能看出这一点
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); 
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); 
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");"); 
Added the calendar!
Added the calendar!
Added the calendar!