javascript - 非空数组的长度为 0

标签 javascript sqlite

我有这个函数,它似乎正在做它应该做的事情:

var getData = function(query)
{
    var data = [];
    db.transaction(function(tx) {
        tx.executeSql(query, [], function (tx, results) {
            var len = results.rows.length, i;
            for (i = 0; i < len; i++) {
                data.push(results.rows.item(i));
            }
        }, error);
    });

    return data;
}

当我执行 console.log(data) 时,它会显示具有正确数据的对象数组,如 Chrome 控制台的示例所示:

Chrome's console showing that the data is correct

但是data.length为0,无法迭代。我试过了

for(var i = 0; i < data.length; i++) {
    $('.regions').append(data[i].region + '<br>');
};

这不好,因为 data.length 是 0。我已经尝试过

for(var key in data) {
    $('.regions').append(data[key].region + '<br>');
};

这不起作用,大概是出于同样的原因。我什至尝试了 jQuery 中的 $.each() ,但没有任何东西进入循环。我在这些循环之前执行一个 console.log(data) 来仔细检查它是否仍然具有我所期望的数据。我用

手动重新创建了数据
data = [
    {
        available: "1",
        company_id: 1,
        cultivar: "Cultivar 2.0",
        cultivar_id: 18,
        id: 18,
        image: "b0c2dd4765422fc0acce9461a040ebaf.png",
        logo: "980f2a610d681ade5b5b42511f89655c.png",
        maintenance: "Fairway",
        maintenance_id: 7,
        name: "Cultivar 2.0",
        region: "Midwest",
        region_id: 24,
        species: "Perennial Ryegrass",
        species_id: 7,
        trait_disease: "Disease 2",
        trait_disease_id: 6,
        available: "1"
    },
    {
        company_id: 1,
        cultivar: "Cultivar 2.0",
        cultivar_id: 18,
        id: 18,
        image: "b0c2dd4765422fc0acce9461a040ebaf.png",
        logo: "980f2a610d681ade5b5b42511f89655c.png",
        maintenance: "Fairway",
        maintenance_id: 7,
        name: "Cultivar 2.0",
        region: "Midwest",
        region_id: 24,
        species: "Perennial Ryegrass",
        species_id: 7,
        trait_disease: "Disease 2",
        trait_disease_id: 6
    }
];

这种类型的东西在控制台中看起来完全相同,但当我迭代它时它起作用了。我在 StackOverflow 周围做了一些其他事情,包括确保它确实被识别为数组。

即使我知道长度,data[0] 也是未定义。我在这上面花了一些甜蜜的时间,想知道是否还有其他的想法。

这已经在 Chrome 18.0.1025.151 中进行了测试(Firefox 没有 sqlite),它最终将进入带有 jQ​​uery Mobile 和 PhoneGap 的手机上,但我们还没有到那一步。只是一个带有 sqlite 数据库的简单 HTML 页面。

谢谢!

最佳答案

您的根本问题是您期望能够从启动它的函数返回异步操作的结果。

对“.executeSql()”的调用立即返回。之后的某个时刻,数据库操作完成并调用您的回调函数。然而,包含函数(“getData()”)早已返回。

围绕异步操作创建 API 的方法是使您自己的 API 异步。为“getData()”提供另一个参数,以便其客户端可以传入处理函数。然后,从回调中调用处理程序并将数组作为参数传递给它。

关于javascript - 非空数组的长度为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10132526/

相关文章:

javascript - 使用 JQuery 在 DIV 中选择一个元素

javascript - 有没有发生 body 变化的事件?

javascript - Django 使用plotly 和表单中的数据绘制图表

javascript - 使用javascript动态更改css类属性

sqlite - 如何反转SQLite CTE的顺序

python - SQLalchemy 不区分大小写的排序顺序

java - Openshift Java SQLite,无法打开/创建数据库文件

java - 在 sqlite DB 中使用 .read 命令读取 .sql 文件以在 java 中执行

java - Sqlite IN 子句在 android 中使用数组中的值不起作用?

php - Facebook 单个页面上的多个点赞按钮