Вызов функции в цикле for, проблема асинхронности

Я пытаюсь вставить строку в свою таблицу 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!

это в закрытой сети, для задания. Это мой первый раз, когда я делаю какой-либо SQL, очевидно, это не будет здорово. Было бы неплохо, если бы вы помогли не атаковать

Clayton D 04.04.2019 00:57

Все запросы выполняются, как вы и предполагали, сбивает с толку только вывод.

Barmar 04.04.2019 01:00

Если вы действительно хотите выполнять запросы последовательно, а не параллельно, см. stackoverflow.com/questions/1151598/…. Речь идет об AJAX-вызовах из браузера, но принцип одинаков для любого повторяющегося асинхронного действия.

Barmar 04.04.2019 01:03

@ Бармар, о, хорошо! Я вижу это, когда смотрю на таблицы сейчас

Clayton D 04.04.2019 01:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
46
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем примере файлы вставляются, но каждая итерация цикла не ожидает вставки файла. Если вы хотите, чтобы журналы вашей консоли выглядели так, как вы описываете, вам нужно вставить следующий файл после обратного вызова. Вы можете добиться этого, полностью удалив цикл 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, написанной так, как есть.

Другие вопросы по теме