Javascript SQL 插入循环

Javascript SQL Insert Loop

我试图通过一个循环向函数传递一个数组,该数组应该 运行 并为每个递增的 SQL 语句调用 db.transaction。

function updateColorData (colorArray) {
    for (var i=0; i<colorArray.length; i++) {
        var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')';
        if (i < colorArray.length-1) {
            db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB);
        } else {
            db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB);
        }
    }
}

作为测试,我正在调用传递数组的 updateColorData 函数,如下所示

['one', 'two', 'three', 'four']

但是当我让数据库读回它收到的信息时,我得到

['four', 'four', 'four', 'four']

我意识到像这样在循环中调用 4 个数据库事务并不是最有效的方法,但我不确定为什么这不起作用或尝试其他方法。

谢谢!

在调用数据库函数之前,您需要为i创建一个新的作用域;试试这个:

function updateColorData (colorArray) {
    for (var i=0; i<colorArray.length; i++) {
        (function(i){
            var sql = 'INSERT INTO SPColorData (color) VALUES   (\''+colorArray[i]+'\')';
            if (i < colorArray.length-1) {
                db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB);
            } else {
            db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB);
            }
        })(i);
    }
}

使用匿名函数为 i 的每个值创建一个单独的函数作用域。您需要这样做,因为原始示例中的 for 循环不断更新 i,而无需等待您的数据库函数变为 return。因此,您需要为数据库函数创建 "safe" 上下文 运行,而 for 循环不会更改 i 的值,这正是匿名函数所提供的。