Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.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 使用数组中的值在本地数据库中循环,函数在循环中_Javascript - Fatal编程技术网

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

Javascript 使用数组中的值在本地数据库中循环,函数在循环中,javascript,Javascript,我试图使用数组中每个对象的“TimeStamp”值遍历数组,以从本地数据库返回相关值。如果我只是简单地使用myArray[0],下面的方法对于单个迭代非常有效,但一旦我尝试将其转换为循环,它就不起作用了。我知道循环中的函数有一些特殊性,但不知道变通/修复是什么 for(var x = 0; x < myArray.length; x++) { tx.executeSql("SELECT * FROM table WHERE entryreference = '"+myArray[

我试图使用数组中每个对象的“TimeStamp”值遍历数组,以从本地数据库返回相关值。如果我只是简单地使用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;


            });

      };
for(var x=0;x
为每个迭代的循环中的代码提供一个临时范围。以前,问题是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);
  };
for(var x=0;x
问题在于,变量“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]));
};
函数makeCallback(目标){
返回函数(发送、结果){
var tempArray=[];
var len=results.rows.length;
对于(变量i=0;i

每个回调都会获取对“myArray”元素的引用,该元素将使用查询结果进行更新。“target”参数对于每个回调都是不同的。

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

您必须分两步执行此操作:

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

  • 执行和处理查询


  • @Jared,我为每个迭代的循环内部代码提供了一个临时作用域。以前,问题是x的值。对于x=myArray.length-1的同一个mysql查询正在执行myArray.length次。我想这已经解决了。。。我做错了吗?看起来效果不错,有人能解释一下投票结果吗?你能测试一下我的答案并发表评论说它是否有效吗?谢谢。下面的答案加上反对票似乎有效,你知道为什么吗?@OliverJ90它有效,因为它与我的答案基本相同。