非空数组的.length为0

CWS*_*ear 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;
}
Run Code Online (Sandbox Code Playgroud)

当我这样做时console.log(data),它会显示一组包含正确数据的对象,您可以在Chrome控制台的示例中看到:

Chrome控制台显示数据正确无误

但是,data.length为0,因此无法进行迭代.我试过了

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

这是不好的,因为data.length是0.我试过了

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

哪个不起作用,大概是出于同样的原因.我甚至尝试过$.each()jQuery,但没有任何东西进入循环.我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
    }
];
Run Code Online (Sandbox Code Playgroud)

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

即使我知道长度,data[0]也是undefined.我花了很多时间在这上面,并想知道是否还有其他任何想法.

这已在Chrome 18.0.1025.151中测试过(Firefox没有sqlite),它最终会用jQuery Mobile和PhoneGap进入手机,但我们还没有达到这一点.只是一个带有sqlite数据库的简单HTML页面.

谢谢!

Poi*_*nty 5

您的基本问题是您希望能够从启动它的函数返回异步操作的结果.

对".executeSql()"的调用立即返回.在此之后的某个时刻,数据库操作完成,并调用您的回调函数.但是,包含函数("getData()")早已返回.

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