在Javascript中,只有for循环中的最后一次运行有效
下面是一个由Javascript编写的for循环。它正在尝试为websql应用查询在Javascript中,只有for循环中的最后一次运行有效,javascript,html,web-sql,Javascript,Html,Web Sql,下面是一个由Javascript编写的for循环。它正在尝试为websql应用查询 for (var i = 0; i < 10; i++){ db.transaction(function (tx){ tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]); }); } for(变量i=0;i
for (var i = 0; i < 10; i++){
db.transaction(function (tx){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
});
}
for(变量i=0;i<10;i++){
数据库事务(功能(tx){
tx.executeSql('插入到ProjSetsT(ProjID)值(?);',[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]);
}
});
db.事务(功能(tx){
对于(变量i=0;i<10;i++){
tx.executeSql('插入到ProjSetsT(ProjID)值(?);',[i]);
}
});
我认为db.transaction
可能会异步运行,这可能会给您带来麻烦。您是否尝试在事务中移动for循环
db.transaction(function (tx){
for (var i = 0; i < 10; i++){
tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
}
});
db.事务(功能(tx){
对于(变量i=0;i<10;i++){
tx.executeSql('插入到ProjSetsT(ProjID)值(?);',[i]);
}
});
您有多个函数引用同一个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]);
};
}
for(变量i=0;i<10;i++){
db.交易(MakeMandler(i));
}
函数makeHandler(j){
返回功能(tx){
tx.executeSql('插入到ProjSetsT(ProjID)值(?);',[j]);
};
}
现在,i
被传递给makeHandler
,后者将其作为j
接收
每次调用
makeHandler
时,它都返回一个引用其本地j
变量的函数。您有几个函数引用同一个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]);
};
}
for(变量i=0;i<10;i++){
db.交易(MakeMandler(i));
}
函数makeHandler(j){
返回功能(tx){
tx.executeSql('插入到ProjSetsT(ProjID)值(?);',[j]);
};
}
现在,i
被传递给makeHandler
,后者将其作为j
接收
每次调用
makeHandler
时,它都返回一个引用其本地j
变量的函数。作为参数传递的每个函数都共享对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
}
for(变量i=0;i<10;i++)
{
数据库事务((功能(privateI)
{//privateI对于每个函数对象都是唯一的
返回功能(tx)
{
tx.executeSql('INSERT-INTO-ProjSetsT(ProjID)值(?);',[privateI]);
};
})(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
}
for(变量i=0;i<10;i++)
{
数据库事务((功能(privateI)
{//privateI对于每个函数对象都是唯一的
返回功能(tx)
{
tx.executeSql('INSERT-INTO-ProjSetsT(ProjID)值(?);',[privateI]);
};
})(i) );//在此处传递当前值
}
语法错误会阻止它直接运行。。。WebSQL是一个异步API,您不能期望它以这种方式捕获正确的值。看见此外,在一个事务中运行多个查询速度更快,实际上可以保证插入顺序。在一个单独的事务中运行每一个查询,对于所有随机排序的事务来说都是一个缓慢的过程。为什么不进行一个查询呢?其中绑定的值是从for循环中的值生成的字符串。语法错误会阻止它直接运行。。。WebSQL是一个异步API,您不能期望它以这种方式捕获正确的值。看见此外,在一个事务中运行多个查询速度更快,实际上可以保证插入顺序。在一个单独的事务中运行每一个查询,对于所有随机排序的事务来说都是一个缓慢的过程。为什么不进行一个查询呢?其中绑定的值是从for循环中的值生成的字符串。您是对的。我认为这是最直接的方法,尽管别人的建议都有效。这就是为什么我把你的答案作为答案。你是对的。我认为这是最直接的方法,尽管别人的建议都有效。这就是为什么我把你的答案作为答案。