javascript MySQL - 使用 Promise-await-async 构造,无法获取等待查询完成的代码

问题描述 投票:0回答:1

我已经尝试了示例代码的多个版本,但似乎永远无法保证在其他代码开始之前完成查询集。我的印象是“等待”使查询在继续之前完成。

我正在 Webstorm 中使用 node.js 运行我的 javascript。下面的代码将三行插入到数据库“ItalianVerbs”的表“Verb”中。我已经在几个不同的条件下尝试过。第一个条件是我有最后一行代码“g_con.end();”和 'process.exit(0);'注释掉了。如果我启动它并让它以这种方式运行,它会快速完成调用,但程序不会退出,并且表行已成功输入数据库 - 但是,日志消息的顺序表明事物正在异步运行。

第二个条件是我在最后取消注释“process.exit(0)”调用 - 在这种情况下,我看到来自“USE”查询的日志消息,但没有看到来自 INSERT 查询的日志消息,这表明没有任何内容正在等待,程序在这些线程完成之前退出。

这让我有点疯狂 - 最终我想要一个可以封装在函数中的代码块,并在函数返回之前完成该函数中启动的所有查询。

我的代码如下,由多个其他示例拼凑而成。

const mysql = require('mysql');

const selectedDB = 'ItalianVerbs';
const str_VerbCols = " (infinitive, english, auxiliary, gerund, participle)";

const g_con = mysql.createConnection(
   {
      host: 'localhost',
      user: 'root',
      password: 'Kl1n&on0per@',
      database: selectedDB
   });

//============================================================================
// SECOND STEP USING MYSQL - select a specific database to use.
//============================================================================

function f_use_db(con, db_name) {
   let qry = 'USE ' + db_name + ';';            // qry = 'USE ItalianVerbs'
   con.query(qry, (err, pkt) => {
      if (err) { throw err;}
   });
   return qry;
}

//============================================================================
// Build query string for INSERT ROW into Verb table.
//============================================================================

function f_query_for_verb_tbl(val_list) {
   if (val_list.length < 5) {
      console.log("[f_insert_info_Verb_row] - ERROR: not enough values for inserted row\n")
      return -1;
   }

   let qry = 'INSERT INTO Verb' + str_VerbCols + ' VALUES (';
   val_list.forEach(function (v, idx) {
      qry = qry + '"' + v + '"';
      if (idx < 4)
         qry = qry + ', ';
   })

   qry = qry + ');';
   return qry;
}

//============================================================================

qPromise1 = async () => {
   const query =  new Promise((resolve, reject) => {
      let qry = f_use_db(g_con, selectedDB, false);
      console.log('*** RUNNING QUERY: ' + qry);
      g_con.query(qry, (err, res) => {                  // q = 'USE ItalianVerbs'
         if (err) { return reject(err); }
         return resolve(res);
      });
   });

   await query;
}

//============================================================================

qPromise2 = async (v_q) => {                          // v_q is INSERT query string.
   console.log('*** RUNNING QUERY: ' + v_q);
   const query = new Promise((resolve, reject) => {
      g_con.query(v_q, (err, res) => {
         if (err) { return reject(err); }
         return resolve(res);
      });
   });

   await query;
}

//============================================================================

async function sequentialQueries (qry) {
   try {
      const r1 = await qPromise1();
      const r2 = await qPromise2(qry);
   }
   catch(err) {
      console.log(err);
      return(err);
   }

   return 0;
}

//============================================================================
//============================================================================

let nvd1 = ["adorare", "adore", "avere", "adorando", "adorato"];
let nvd2 = ["abitare", "dwell", "avere", "abitando", "abitato"];
let nvd3 = ["abbassare", "let-down", "avere", "abbandonando", "abbandonato"]

let lvd_list = [nvd1, nvd2, nvd3];

g_con.connect(function(err) {
   if (err) { console.log('error on connect to MySql - ' + err); }
});

lvd_list.forEach(function (v) {
   let v_qry = f_query_for_verb_tbl(v);
   let rval = sequentialQueries(v_qry);
})

// g_con.end();
console.log('exiting');
// process.exit(0);
javascript mysql node.js async-await promise
1个回答
0
投票

请尝试以下方法:

for (const v of lvd_list) {
   let v_qry = f_query_for_verb_tbl(v);
   let rval = await sequentialQueries(v_qry);
}
© www.soinside.com 2019 - 2024. All rights reserved.