我要实现的是,将表单元格中的文本值插入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)
})
})
}
}
}
})
}
答案 0 :(得分:2)
否,代码仍在运行,但处于异步状态。异步代码将语句带到主程序流之外,从而允许异步调用后的代码立即执行而无需等待。
由于sql函数是异步的,因此在完成第一个循环之前就关闭了连接。例如,y === 1
是y === 0
仍在运行时的插入过程,您将其关闭,因此事务被取消了。最好了解一下异步,回调,promise的工作方式>
我不知道您的sql客户端是否支持池化。但是,您应该删除行sql.close()
。完成所有交易后将其关闭。
但是,我所关心的是,如果y只有0
和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);
});
})
}