Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中,只有for循环中的最后一次运行有效_Javascript_Html_Web Sql - Fatal编程技术网

在Javascript中,只有for循环中的最后一次运行有效

在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

下面是一个由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<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循环中的值生成的字符串。您是对的。我认为这是最直接的方法,尽管别人的建议都有效。这就是为什么我把你的答案作为答案。你是对的。我认为这是最直接的方法,尽管别人的建议都有效。这就是为什么我把你的答案作为答案。