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)时如果调用了code>,则可能尚未执行查询
下面是一个稍加修改的函数版本,它将回调作为参数,并在填充标签
数组后调用它:
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);
});