我正在尝试在循环中插入数据,但它没有等到插入完成。 我的代码如下:
con.query('INSERT INTO pair_report_detail (studentID1, studentID2, result1, result2)
VALUES (\''+studentID[i]+'\', \''+studentID[j]+'\',
'+result1.toFixed(2)+', '+result2.toFixed(2)+')', function(err, result) {
if (err) throw err;
var pair_report_detailID = result.insertId;
var tokenMatchMarks = 0;
var matchNo = 0;
console.log(functions[i].length);
console.log(functions[j].length);
var sizeFile1 = functions[i].length;
for(var z = 0; z < 20; z++)
{
if(z == tokenMatch1[tokenMatchMarks])
{
matchNo++;
con.query('INSERT INTO functions (studentID, reportID , content, matchno)
VALUES (\''+studentID[i]+'\', '+pair_report_detailID+', \''+functions[i][z]+'\', '+matchNo+')', function(err, result) {
if (err) throw err;
tokenMatchMarks++;
console.log("Insert funtions");
});
}else
{
con.query('INSERT INTO functions (studentID, reportID , content) VALUES (\''+studentID[i]+'\', '+pair_report_detailID+', \''+functions[i][z]+'\')', function(err, result) {
if (err) throw err;
console.log("Insert funtions");
});
}
}
});
我做错了什么?我知道NodeJS工作异步,不等待任何功能完成。但必须有一种方法可行。我做错了什么,或者我误解了什么?
先谢谢了! ;)
答案 0 :(得分:0)
原因在于你的回答。 NodeJS
是async
,因此,它不会等待循环完成。
mysql2
包中包含带有promises的mysql,因此它将极大地帮助您实现目标。特别是使用async
和await
另外:使用let
代替var
for for循环
答案 1 :(得分:0)
还可以使用递归。
一些建议:
?
占位符,以避免sql注入begin; <insert pair_report_detail>; <20 times: insert functions>; commit;
来避免它,并对任何错误执行rollback;
。 我不知道您到底需要什么,在下面的假设代码下:)
let query1 = 'insert into pair_report_detail (studentID1, studentID2, result1, result2) values (?, ?, ?, ?)';
let query2 = 'insert into functions (studentID, reportID , content, matchno) values (?, ?, ?, ?)';
con.query(query1, [studentID[i], studentID[j], result1.toFixed(2), result2.toFixed(2)], function (err, results) {
if (err)
throw err;
let id = result.insertId;
let tokenMatchMarks = 0;
let matchNo = 0;
function insert (idx) {
if (idx == 20)
return console.log('DONE!');
let isMatch = tokenMatch1[tokenMatchMarks];
if (isMatch)
tokenMatchMarks++;
con.query(query2, [studentID[i], id, functions[i][idx], isMatch ? matchNo : null], function (err, res) {
if (err)
throw err;
insert (idx + 1);
})
}
insert (0);
});