Запросы не выполняются последовательно, даже если используются обещания - PullRequest
0 голосов
/ 11 января 2019

Итак, я хочу запустить все эти SQL-запросы в следующей последовательности:

 db.query("DROP TABLE if exists `wlb`.`library`, `wlb`.`tag_instance`, `wlb`.`tags`, `wlb`.`users`, `wlb`.`vote_library`, `wlb`.`vote_table`")
  .then(db.query(Users).then(csv.parseCSV("users")
    .then(db.query(Library).then(csv.parseCSV("Library")
      .then(db.query(Tags).then(csv.parseCSV("tags")
        .then(db.query(Tag_instance).then(csv.parseCSV("Tag_instance")
          .then(db.query(Vote_table).then(csv.parseCSV("Vote_table") 
            .then(db.query(Vote_library).then(csv.parseCSV("Vote_library")
 )))))))))))).catch("Error");

Функция db.query выглядит следующим образом:

var query = function (query,callback) {
  return new Promise(function (resolve, reject) {
    conn.db.query(query, function(error, result) {
      if(error){
        reject(new Error("Error occurred while making query" + error));
      } else{
        console.log("Query Executed");
        resolve(result);
      }
    })
  });
}

И функция parseCSV выглядит следующим образом:

var parseCSV = (name) => {
  return new Promise(function (resolve, reject) {
    filePath = __dirname + `/../../Data/${name}.csv`;
    fs.readFile(filePath, {
      encoding: 'utf-8'
    }, function (err, csvData) {
       if (err) {
         console.log(err);
       }
       csvParser(csvData, {
         delimiter: ',',
         cast: true
       }, function (err, data) {
         if (err) {
           console.log(err);
         } else {
           var sql="INSERT INTO `wlb`."+`${name}`+ " VALUES ?";
           data.splice(0,1);
           conn.db.query(sql, [data], function(err) {
           if (err){conn.db.end();
              console.log(name);
              throw err;
           }
           console.log(`${name} Inserted `);
         })
      }});
   });
 });
}

Проблема здесь в том, что, хотя я использовал обещания, запросы не последовательны, как описано. Сначала выполняются все обещания db.query, а затем выполняется анализ CSV.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Обещание в parseCSV не разрешено / отклонено:

var parseCSV = (name) => {
  return new Promise(function (resolve, reject) {
    filePath = __dirname + `/../../Data/${name}.csv`;
    fs.readFile(filePath, {
      encoding: 'utf-8'
    }, function (err, csvData) {
       if (err) {
         console.log(err);
         reject(err)                   // here
       }
       csvParser(csvData, {
         delimiter: ',',
         cast: true
       }, function (err, data) {
         if (err) {
           console.log(err);
           reject(err)                   // here
         } else {
           var sql="INSERT INTO `wlb`."+`${name}`+ " VALUES ?";
           data.splice(0,1);
           conn.db.query(sql, [data], function(err) {
           if (err){conn.db.end();
              console.log(name);
              reject(err)                   // here
           }
           console.log(`${name} Inserted `);
           resolve()                        // here
         })
      }});
   });
 });
}

Кроме того, взгляните на async / await, чтобы сделать этот код более читабельным.

0 голосов
/ 11 января 2019

Вы не вызываете разрешение или отклонение в функции parse.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...