在转到下一次迭代之前强制循环等待mysql插入

时间:2018-02-12 21:22:07

标签: javascript mysql node.js express

我有一个循环运行并在每次迭代时将记录插入到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);
            }
          });   
       }
    });

2 个答案:

答案 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。

&#13;
&#13;
(async  () => {
        for (let i = 0; i < 10; i++) {
                console.log(i);
                await new Promise (resolve => setTimeout (resolve, 500))
        }
})();
&#13;
&#13;
&#13;

将您的整个函数包含在承诺中,并用超时承诺替换它。

或者你可以使用一个现代的for循环,其中await将按预期工作:

async function query() {
  for (let d of detail) {
    const contents = await your_query_promise();
  }
}