javascript代码从执行中跳过了几行

时间:2018-08-04 11:49:13

标签: javascript

我要实现的是,将表单元格中的文本值插入2个不同的sql表中。如果我评论另一个,它们会起作用。但是,如果我想使用上面的代码,则它会完全丢失第一个循环,其中y === 0,第二个sql接收所有未定义的值,但是我可以在sql.connect行之前打印它们。

这是我的代码

function update() {
  $('body').on('click', '#btnSave', function() {
    values = []
    $('input.form-control').each(function() {
      var valueNew = $(this).val();
      $(this).attr('disabled', true);
      values.push(valueNew);
    })

    for (var y = 0; y < 2; y++) {
      if (y === 0) {
        console.log(y)
        sql.close()
        sql.connect(config, err => {
          const request = new sql.Request()
          let editorTexts = $('#summernote').summernote()[0].value;
          console.log(editorTexts)
          request.query(`INSERT INTO table (col1, col2, col3) VALUES ('${values[1]}', '${values[0]}', '${editorTexts}')`)
          request.on('recordset', columns => {})
          request.on('row', row => {})
          request.on('error', err => {})
          request.on('done', result => {
            console.log(result.rowsAffected)
          })
        })
      } else {
        var table = $("#table tbody");
        for (var x = 0; x < table[0].rows.length; x++) {
          sql.close()
          sql.connect(config, err => {
            const request = new sql.Request()
            request.query(`INSERT INTO table2 (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14) VALUES ('${values[1]}', '${values[0]}', '${values[3 + (x*10)]}', '${values[4 + (x*10)]}', '${values[5 + (x*10)]}', '${values[6 + (x*10)]}', '${values[7 + (x*10)]}' ,'${values[8 + (x*10)]}','${values[9 + (x*10)]}', '${values[10 + (x*10)]}', '${values[2]}', '${values[11 + (x*10)]}', '${values[12 + (x*10)]}', '${+lastID[0]+1}')`)
            request.on('recordset', columns => {})
            request.on('row', row => {})
            request.on('error', err => {})
            request.on('done', result => {
              console.log(result.rowsAffected)
            })
          })
        }
      }
    }
  })
}

1 个答案:

答案 0 :(得分:2)

否,代码仍在运行,但处于异步状态。异步代码将语句带到主程序流之外,从而允许异步调用后的代码立即执行而无需等待。

由于sql函数是异步的,因此在完成第一个循环之前就关闭了连接。例如,y === 1y === 0仍在运行时的插入过程,您将其关闭,因此事务被取消了。最好了解一下异步,回调,promise的工作方式

我不知道您的sql客户端是否支持池化。但是,您应该删除行sql.close()。完成所有交易后将其关闭。

但是,我所关心的是,如果y只有01,为什么要循环执行呢?最好按如下步骤进行操作:

function update() {
  $('body').on('click', '#btnSave', function() {
    values = []
    $('input.form-control').each(function() {
      var valueNew = $(this).val();
      $(this).attr('disabled', true);
      values.push(valueNew);
    })

    // y === 0
    sql.connect(config, err => {
      const request = new sql.Request()
      let editorTexts = $('#summernote').summernote()[0].value;
      console.log(editorTexts)
      request.query(`INSERT INTO table (col1, col2, col3) VALUES ('${values[1]}', '${values[0]}', '${editorTexts}')`)
      request.on('recordset', columns => {})
      request.on('row', row => {})
      request.on('error', err => {})
      request.on('done', result => {

         // y === 1
         var table = $("#table tbody");
          for (var x = 0; x < table[0].rows.length; x++) {
            sql.connect(config, err => {
              const request = new sql.Request()
              request.query(`INSERT INTO table2 (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14) VALUES ('${values[1]}', '${values[0]}', '${values[3 + (x*10)]}', '${values[4 + (x*10)]}', '${values[5 + (x*10)]}', '${values[6 + (x*10)]}', '${values[7 + (x*10)]}' ,'${values[8 + (x*10)]}','${values[9 + (x*10)]}', '${values[10 + (x*10)]}', '${values[2]}', '${values[11 + (x*10)]}', '${values[12 + (x*10)]}', '${+lastID[0]+1}')`)
              request.on('recordset', columns => {})
              request.on('row', row => {})
              request.on('error', err => {})
              request.on('done', result => {
                console.log(result.rowsAffected)
              })
            })
          }
        })
      })
    }
  })
}

如果您知道如何使用Promise,最好用Promise包装异步任务。这样更安全,更清洁,例如:

    function insertTable(values) {
      return sql.connect(config)
        .then((pool) => {
          const editorTexts = $('#summernote').summernote()[0].value

          return pool.request().query(`INSERT INTO table (col1, col2, col3) VALUES ('${values[1]}', '${values[0]}', '${editorTexts}')`)
        })
    }

    function insertTable1(x, values) {
      return sql.connect(config)
        .then((pool) => {
          return pool.request().query(`INSERT INTO table2 (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11, col12, col13, col14) VALUES ('${values[1]}', '${values[0]}', '${values[3 + (x*10)]}', '${values[4 + (x*10)]}', '${values[5 + (x*10)]}', '${values[6 + (x*10)]}', '${values[7 + (x*10)]}' ,'${values[8 + (x*10)]}','${values[9 + (x*10)]}', '${values[10 + (x*10)]}', '${values[2]}', '${values[11 + (x*10)]}', '${values[12 + (x*10)]}', '${+lastID[0]+1}')`)
      })
        })
    }

    function update() {
      $('body').on('click', '#btnSave', function() {
        const values = []
        $('input.form-control').each(function() {
          var valueNew = $(this).val();
          $(this).attr('disabled', true);
          values.push(valueNew);
        })

        // y === 0
        insertTable(values)
          .then(() => {
            // y === 1
            const table = $("#table tbody");
            const tasks = []
              for (var x = 0; x < table[0].rows.length; x++) {
                tasks.push(insertTable1(x, values));
              }

              return Promise.all(tasks);
          }).then((results) => {
            console.log("Inserted successfully");
          }).catch((err) => {
            console.error(err);
          });
      })
    }