Я бы сказал, что tx.executeSql()
является асинхронным, и анонимные функции, переданные в качестве аргумента3, фактически выполняются после того, как retrieveLabels();
вернулось.
Итак, во время вашего второго console.log(labels.length);
вызван, возможно, запрос не был выполнен.
Вот слегка измененная версия вашей функции, которая принимает обратный вызов в качестве аргумента и вызывает его после заполнения массива labels
:
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);
});