0

私はそれがすべきことをしているように見えるこの関数を持っています:

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のコンソール

ただし、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]ですundefined。私はこれにいくつかの甘い時間を費やし、他に何かアイデアがあるかどうか疑問に思いました。

これはChrome18.0.1025.151(Firefoxにはsqliteがありません)でテストされており、最終的にはjQuery MobileとPhoneGapを搭載した電話に移行しますが、まだその時点ではありません。sqliteデータベースを備えた単純なHTMLページ。

ありがとう!

4

1 に答える 1

5

基本的な問題は、非同期操作の結果を、それを開始する関数から返すことができると期待していることです。

「.executeSql()」を呼び出すと、すぐに戻ります。その後のある時点で、データベース操作が完了し、コールバック関数が呼び出されます。ただし、含まれている関数( "getData()")が返されるのはずっと前のことです。

非同期操作を中心にAPIを作成する方法は、独自のAPIを非同期にすることです。クライアントがハンドラー関数を渡すことができるように、「getData()」に別のパラメーターを指定します。次に、コールバックからハンドラーを呼び出し、配列をパラメーターとして渡します。

于 2012-04-12T22:07:41.980 に答える