我有一个循环运行并在每次迭代时将记录插入到mysql数据库中。问题是我认为异步会搞砸数据库的写入。如果我有一个10迭代循环,则只记录8个插入(例如)。 我正在尝试找到一种方法使循环等待更新发生,然后再进行循环的下一次迭代。这是代码:
var queryString1 = "insert into expense_summary "+
"(user_id, customer_id, expense_date, category, cost) values (?,?,?,?,?)"
connection.query(queryString1, [
detail[0].employee,
detail[0].customer,
detail[0].date,
detail[0].category,
detail[0].total], function(err, result) {
var summaryId = result.insertId;
console.log("This is the summary ID" + summaryId);
var data;
for (i = 0; i < detail.length; i++) {
var queryString = "insert into expense_detail "+
"(expense_summary_id, expense_date, line_id, item_name, description, cost_per, quantity, tax, user_id, customer_id, expense_category_id, ad_hoc, reimbursable) "+
"values (?,?,?,?,?,?,?,?,?,?,?,?,?)";
connection.query(queryString, [
summaryId,
detail[i].date,
detail[i].line,
detail[i].item,
detail[i].description,
detail[i].cost,
detail[i].quantity,
detail[i].tax,
detail[i].employee,
detail[i].customer,
detail[i].category,
detail[i].adHoc,
detail[i].reimbursable], function(err, result) {
if(err){
throw err;
} else{
console.log(result);
}
});
}
});
答案 0 :(得分:0)
它看起来是变量和范围的典型问题。 试着改变这两行:
for (let i=0; i<detail.length; i++){
let queryString = "insert into expense_detail "+
"(expense_summary_id, expense_date, line_id, item_name, description, cost_per, quantity, tax, user_id, customer_id, expense_category_id, ad_hoc, reimbursable) "+
"values (?,?,?,?,?,?,?,?,?,?,?,?,?)";
声明varibales可以避免在不同的迭代中共享变量值
答案 1 :(得分:0)
如果您使用最新的node.js&gt;您可以使用async / await; 8。
(async () => {
for (let i = 0; i < 10; i++) {
console.log(i);
await new Promise (resolve => setTimeout (resolve, 500))
}
})();
&#13;
将您的整个函数包含在承诺中,并用超时承诺替换它。
或者你可以使用一个现代的for循环,其中await将按预期工作:
async function query() {
for (let d of detail) {
const contents = await your_query_promise();
}
}