使用数组中的值在本地数据库中循环,函数在循环中

Loop through a local database with a value from an array, function inside a loop

本文关键字:循环 数据库 函数 数组      更新时间:2023-09-26

我正试图使用数组中每个对象的"TimeStamp"值迭代该数组,以从本地DB返回相关值。如果我只是简单地使用myArray[0],下面的内容非常适用于单个迭代,但一旦我尝试将其转换为循环,它就不起作用了。我知道循环中的函数有一些特殊之处,但不知道解决方法是什么。

for(var x = 0; x < myArray.length; x++) {
    tx.executeSql("SELECT * FROM table WHERE entryreference = '"+myArray[x].TimeStamp+"' ", [], function(tx,results){
            var tempArray = [];
            var len = results.rows.length;
            for (var i = 0; i < len; i++){
            var tempObject = {
            "Value": results.rows.item(i).value
            }
            tempArray.push(tempObject);
            }
            myArray[x].embeddedArray = tempArray;

            });
      };

为每次迭代的循环内代码提供一个临时范围。以前的问题是x的值。对x=myArray.length-1的相同mysql查询执行myArray.length次。我想这个问题已经解决了。。。

for(var x = 0; x < myArray.length; x++) {
   (function(x){
        tx.executeSql("SELECT * FROM table WHERE entry reference = '"+myArray[x].TimeStamp+"' ", [], function(tx,results){
        var tempArray = [];
        var len = results.rows.length;
        for (var i = 0; i < len; i++){
        var tempObject = {
        "Value": results.rows.item(i).value
        }
        tempArray.push(tempObject);
        }
        myArray[x].embeddedArray = tempArray;

        });
     })(x);
  };

即使您成功地更正了代码,它的效率也非常低,因为您正在为myArray中的每个值运行SQL查询。

你必须分两步完成:

  1. 通过迭代构建查询的WHERE部分,可能使用IN条件。

  2. 执行和处理查询。

问题是,变量"x"由循环中创建的所有回调函数共享,当实际调用回调时,"x"的值将比数组的长度大一。为了解决这个问题,您必须用另一个函数封装回调函数的构造,以便每个回调都引用要构建的"嵌入式"数组:

function makeCallback(target) {
    return function(tx, results) {
        var tempArray = [];
        var len = results.rows.length;
        for (var i = 0; i < len; i++) {
            var tempObject = {
                "Value": results.rows.item(i).value
            }
            tempArray.push(tempObject);
        }
        target.embeddedArray = tempArray;
    };
}
for (var x = 0; x < myArray.length; x++) {
    tx.executeSql("SELECT * FROM table WHERE entryreference = '" + myArray[x].TimeStamp + "' ", [],
        makeCallback(myArray[x]));
};

每个回调都会获得对"myArray"元素的引用,该元素将随查询结果更新。"target"参数对于每个回调都是不同的。