我已经尝试了示例代码的多个版本,但似乎永远无法保证在其他代码开始之前完成查询集。我的印象是“等待”使查询在继续之前完成。
我正在 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);
请尝试以下方法:
for (const v of lvd_list) {
let v_qry = f_query_for_verb_tbl(v);
let rval = await sequentialQueries(v_qry);
}