Я пытаюсь вставить строку в свою таблицу FILE, но когда я пытаюсь это сделать, порядок, в котором выполняются действия, не тот, который мне нужен. Я знаю, что JS асинхронный, но я не уверен, как это влияет на то, как я должен работать в цикле.
Некоторый фон, sharedLib.serverCreateCalendar(file) просто берет файл .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.info(calInsert);
//Send the SQL query to add a file
connection.query(calInsert, function(err, result) {
if (err) { //error inserting into the DB
console.info("Calendar insert error");
res.send("Error");
} else { //if placing the calendar is good then add the events
console.info("Added the calendar!");
}
});
}
В идеале это будет вывод
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");");
Added the calendar!
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");");
Added the calendar!
("INSERT INTO FILE (file_Name, version, prod_id) VALUES('" + fileN + "'," + version + ",'" + prodID + "'" + ");");
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!
Все запросы выполняются, как вы и предполагали, сбивает с толку только вывод.
Если вы действительно хотите выполнять запросы последовательно, а не параллельно, см. stackoverflow.com/questions/1151598/…. Речь идет об AJAX-вызовах из браузера, но принцип одинаков для любого повторяющегося асинхронного действия.
@ Бармар, о, хорошо! Я вижу это, когда смотрю на таблицы сейчас



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем примере файлы вставляются, но каждая итерация цикла не ожидает вставки файла. Если вы хотите, чтобы журналы вашей консоли выглядели так, как вы описываете, вам нужно вставить следующий файл после обратного вызова. Вы можете добиться этого, полностью удалив цикл for:
var files = []; // Get an array of files some how
function insertFiles(theFiles) {
// Handle end condition
if (theFiles === undefined || theFiles.length == 0) {
return;
}
var cals = sharedLib.serverCreateCalendar(file); // get the cal info as a JSON
var obj = JSON.parse(cals); //parse the calendar JSON
var fileN = theFiles.shift(); // Get the first file and remove from array
var version = obj.version;
var prodID = obj.prodID;
var 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.info(calInsert);
//Send the SQL query to add a file
connection.query(calInsert, function(err, result) {
if (err) { //error inserting into the DB
console.info("Calendar insert error");
res.send("Error");
} else { //if placing the calendar is good then add the events
console.info("Added the calendar!");
insertFiles(theFiles);
}
});
}
insertFiles(files);
Но, конечно, как было указано в комментариях, может быть другие вопросы с командой вставки SQL, написанной так, как есть.
это в закрытой сети, для задания. Это мой первый раз, когда я делаю какой-либо SQL, очевидно, это не будет здорово. Было бы неплохо, если бы вы помогли не атаковать