javascript - 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)
})
})
}
}
}
})
}
解决方案
不,代码仍在运行,但处于异步状态。异步代码在主程序流程之外获取语句,允许异步调用之后的代码立即执行而无需等待。
因为 sql 函数是异步的,所以您在第一个循环完成之前关闭了连接。eg when y === 1
,插入的过程y === 0
还在运行的时候,你关闭了,所以事务被取消了
我不知道你的 sql 客户端是否支持池化。但是,您应该删除该行sql.close()
。所有交易完成后关闭一次。
但是,我关心的是,如果 y 只有0
and 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);
});
})
}
推荐阅读
- java - 使用 Spring Security 进行 Spring Boot 2 测试
- typewriter - 打字机:生成带有附加后缀的变量名
- autohotkey - 打开 Excel 工作表并按 Ctrl + Q
- python-3.x - 如何在python中制作一个以小时和分钟计算其条目的列表?
- r - 如何从 get.hist.quote 保存交易日期
- .htaccess - .htaccess 将 example.com/store/page.html 重写为 domain.com/page.html
- android - Android BLE onScanFailed 与三星手机中的状态 2
- angularjs - Protractor Jasmine 中的异常或错误处理
- excel - 将用户定义的范围插入另一个工作表
- python - 无法解析导入时的 Python 路径