首页 > 解决方案 > 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)
            })
          })
        }
      }
    }
  })
}

标签: javascript

解决方案


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

因为 sql 函数是异步的,所以您在第一个循环完成之前关闭了连接。eg when y === 1,插入的过程y === 0还在运行的时候,你关闭了,所以事务被取消了

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

但是,我关心的是,如果 y 只有0and 1,为什么要循环执行?如果你像这样一步一步地做会更好:

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);
          });
      })
    }

推荐阅读