1

这是一个用 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”,但没有插入前八个数字。

有没有语法错误?

4

3 回答 3

4

我认为db.transaction可能会异步运行,因此可能会给您带来麻烦。您是否尝试过将 for 循环移动到事务中?

db.transaction(function (tx){
    for (var i = 0; i < 10; i++){
        tx.executeSql('INSERT INTO ProjSetsT (ProjID) VALUES (?);', [i]);
    }
});
于 2012-09-25T15:38:36.470 回答
2

作为参数传递的每个函数都共享对 的相同引用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
}
于 2012-09-25T15:40:32.060 回答
1

您有多个函数引用同一个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变量的函数。

于 2012-09-25T15:38:40.400 回答