我正在处理我正在处理的数据库应用程序。在我的SQL事务完成之前,似乎我的javascript函数继续进行。下面是我正在经历的非常简化的版本。在实际的函数中,我试图在表上做一些工作,然后转到for循环中的下一个值。它似乎在for循环中完成所有操作,然后完成SQL事务。
以下是示例代码:
function fillTables(){
db.transaction(function (tx){
for(var i=0; i<3; i++){
console.log('Filling row '+i);
tx.executeSql(
'INSERT INTO Numbers (Value) VALUES (?)',
[i],
function (){
console.log('Inserted Row');
},
errorCB);
console.log('moving on...');
}
});
}
我希望看到的控制台日志是:
Filling Row 0
Inserted Row
moving on...
Filling Row 1
Inserted Row
moving on...
Filling Row 2
Inserted Row
moving on...
然而,我得到了:
Filling row 0
moving on...
Filling row 1
moving on...
Filling row 2
moving on...
Inserted Row
Inserted Row
Inserted Row
关于如何实现预期结果的任何想法?
答案 0 :(得分:1)
tx.executeSql()
是一个异步函数,行为恰当。我会为您寻找同步方法并编辑我的回复。
所以根据我所读到的,该函数仅由于HTML5规范而异步。此外,如果您以某种方式同步运行它将返回“无效状态”错误。
答案 1 :(得分:0)
tx.executeSql()是一个异步函数,在这种情况下,您需要在函数完成后执行递归调用。
function fillTables() {
db.transaction(function (tx){
var recursiveFunction = function (index, length) {
if (index < length) {
console.log('Filling row ' + index);
tx.executeSql(
'INSERT INTO Numbers (Value) VALUES (?)',
[index],
function (){
console.log('Inserted Row');
console.log('moving on...');
recursiveFunction(++index, length);
},
errorCB);
}
}
recursiveFunction(0, 3);
});
}