1

phonegap アプリケーションを作成しています。私は Web SQL を使用していますが、データを取得するまではすべて正常に動作します。

function getItemGroups(){

    var items_groups = new Array();
    var db = window.openDatabase("merbokDB", "1.0", "MerbokDB", 5232394);

    db.transaction(
        function(tx){
            tx.executeSql('SELECT * FROM item_groups',[],
                function(tx,result){
                    if(result.rows.length > 0){

                        var len = result.rows.length;

                        for (var i=0; i<len; i++){

                            items_groups.push(result.rows.item(i).item_group);

                        }
                        console.log(items_groups.join());

                    }
                }
                ,errorCB);
        },
        errorCB);

    return items_groups;
}
var myproducts = getItemGroups();

私の問題は、「myproducts」変数が空白のコードを実行したときでした。しかし、私は見ることができます

console.log(items_groups.join());

コンソールに値を出力する次の行。帰り方間違ってない?

4

1 に答える 1

3

私はあなたが使用しているフレームワークに 100% 精通しているわけではありませんが、チェーンの各ステップに渡される関数は非同期コールバック用であると推測できます。したがって、実行後のステートメントのに実行されるという保証はありません。したがって、本質的に起こっているのは、次の行です。

return items_groups;

これらの内部関数のいずれかが実行される前に実行されています。したがって、空の配列である初期値を返すだけです。

しばらくして (場合によっては数ミリ秒後)、内部関数が実行され、コンソール ログ出力が表示されます。

このような非同期機能を扱う場合、順番に実行されるコード行のシーケンスに依存することはできません。「次の行で」ロジックを実行する代わりに、何らかのコールバック関数で実行する必要があります。この場合、データが取得された後の最終的なコールバックは次のようになります。

function(tx,result){
    if(result.rows.length > 0){

        var len = result.rows.length;

        for (var i=0; i<len; i++){

            items_groups.push(result.rows.item(i).item_group);

        }
        console.log(items_groups.join());

    }
}

変数で何をしようとしてもmyproducts、その関数で開始する必要があります。

于 2013-06-25T16:25:02.407 に答える