Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.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_Arrays - Fatal编程技术网

Javascript 由函数追加的全局数组在别处显示为零长度

Javascript 由函数追加的全局数组在别处显示为零长度,javascript,arrays,Javascript,Arrays,我已经在脚本顶部声明了数组标签 var labels = []; 调用retrieveLabels函数以附加到此数组: function retrieveLabels() { labels = []; var getLabelsQuery = "SELECT DISTINCT label FROM items ORDER BY label;" db.transaction(function(tx) { tx.executeSq

我已经在脚本顶部声明了数组标签

var labels = [];
调用retrieveLabels函数以附加到此数组:

     function retrieveLabels() {
      labels = [];
      var getLabelsQuery = "SELECT DISTINCT label FROM items ORDER BY label;"
      db.transaction(function(tx) {
           tx.executeSql(getLabelsQuery, [],
                function(tx, labelsResults) {
                     for (var x = 0; x < labelsResults.rows.length; x++) {
                          var labelsRow = labelsResults.rows.item(x);
                          labels.push(labelsRow['label']);
                     }
                     console.log(labels.length);
                     console.log(labels);
                }
           );
      });
 }
}

第一条控制台消息显示0项。 第二条控制台消息显示[“label1”、“label2”…“label34”]


为什么这会突然变成一个0长度的数组?或者它在RetrievelLabel中被修改了吗?

您对db.transaction或tx.executeSql的调用可能是异步的。这意味着在调用console.log(labels.length)时,数组标签尚未填充;控制台日志(标签);在else语句中

您可以通过编辑代码进行检查:

db.transaction(function(tx) {
       tx.executeSql(getLabelsQuery, [],
            function(tx, labelsResults) {
                 for (var x = 0; x < labelsResults.rows.length; x++) {
                      var labelsRow = labelsResults.rows.item(x);
                      labels.push(labelsRow['label']);
                 }
                 console.log("tx.exectureSQL done");
            }
       );
  });

通过这种方式,您可以首先看到实际发生的情况。

我想说
tx.executeSql()
是异步的,作为argument3传递的匿名函数实际上是在retrieveLabels()之后执行的已返回

所以在第二次
console.log(labels.length)时,则可能尚未执行查询

下面是一个稍加修改的函数版本,它将回调作为参数,并在填充
标签
数组后调用它:

function retrieveLabels(callback) {
    var labels = [];
    var getLabelsQuery = "SELECT DISTINCT label FROM items ORDER BY label;"
    db.transaction(function(tx) {
        tx.executeSql(getLabelsQuery, [],
            function(tx, labelsResults) {
                for (var x = 0; x < labelsResults.rows.length; x++) {
                    var labelsRow = labelsResults.rows.item(x);
                    labels.push(labelsRow['label']);
                }               

                callback(labels);
            }           
        );      
    }); 
}

这很有魅力。现在,你能给我解释一下你做了什么,为什么要修理它吗?我听过回调这个词,但不完全理解它<代码>回调
通常指传递给函数参数的内容,以便函数将其回调。这里的
callback
参数就是,传递给db.transaction、tx.executeSql和retrievelabel的匿名函数都是回调函数。现在,一旦我有了所有标签,我就要为每个标签进行另一个db事务。它将提取标签名为“x”的项目列表,并将HTML附加为列表。最好的处理方法是什么?请原谅我的询问,我对JS的第一次尝试是构建Safari扩展如果可能的话,加入
吧:)谢谢!注:打字功能(标签)应为功能(标签)
else {
    init_db();
    retrieveLabels();
    console.log("else done");
}
function retrieveLabels(callback) {
    var labels = [];
    var getLabelsQuery = "SELECT DISTINCT label FROM items ORDER BY label;"
    db.transaction(function(tx) {
        tx.executeSql(getLabelsQuery, [],
            function(tx, labelsResults) {
                for (var x = 0; x < labelsResults.rows.length; x++) {
                    var labelsRow = labelsResults.rows.item(x);
                    labels.push(labelsRow['label']);
                }               

                callback(labels);
            }           
        );      
    }); 
}
init_db();
retrieveLabels(function(label) {
    console.log(labels.length);
    console.log(labels);
});