只有 Java script 中 for 循环中的最后一次运行有效



这是一个由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变量的函数。

相关内容

最新更新