这是一个由Javascript编写的for循环。它正在尝试对websql应用查询。
for (var i = 0; i < 10; i++){
db.transaction(function (tx){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
});
}
尝试很明显,我尝试添加值"0, 1, 2, ...9"到表 ProjSetsT 中的列 ProjID。它不起作用。我只插入了最后一个元素,即"9",但没有插入前八个数字。
是否有任何语法错误?
我认为db.transaction
可能会异步运行,因此可能会为您搞砸。您是否尝试过在事务中移动 for 循环?
db.transaction(function (tx){
for (var i = 0; i < 10; i++){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
}
});
您作为参数传递的每个函数都共享对i
的相同引用,因此每个新函数对象的i
值都会递增。 给定异步上下文,在调用在循环中创建的第一个函数之前,i
将达到其最大大小
您可以使用闭包修复它:
for (var i = 0; i < 10; i++)
{
db.transaction((function(privateI)
{//privateI is unique for every function object
return function (tx)
{
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [privateI]);
};
})(i));//pass current value here
}
您有几个函数引用同一个i
变量,最终为 10
。
您需要为每个函数提供一个新的可变作用域。
for (var i = 0; i < 10; i++){
db.transaction(makeHandler(i));
}
function makeHandler(j) {
return function (tx){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [j]);
};
}
现在i
被传递给makeHandler
,接收它作为j
。
每次调用makeHandler
时,它都会返回一个引用其本地j
变量的函数。